Merge lp:~mikemc/ubuntuone-ios-files/main-queue-callback-refactor into lp:ubuntuone-ios-files

Proposed by Mike McCracken
Status: Merged
Approved by: Brian Curtin
Approved revision: 81
Merged at revision: 85
Proposed branch: lp:~mikemc/ubuntuone-ios-files/main-queue-callback-refactor
Merge into: lp:ubuntuone-ios-files
Diff against target: 563 lines (+126/-134)
8 files modified
Files/U1AutoUploadOperation.m (+9/-12)
Files/U1AutoUploadsManager.m (+1/-1)
Files/U1FileDetailsViewController.m (+12/-16)
Files/U1FilesClient.h (+6/-6)
Files/U1FilesClient.m (+24/-24)
Files/U1FilesService.h (+11/-11)
Files/U1FilesService.m (+54/-52)
Files/U1UploadOperation.m (+9/-12)
To merge this branch: bzr merge lp:~mikemc/ubuntuone-ios-files/main-queue-callback-refactor
Reviewer Review Type Date Requested Status
Brian Curtin (community) Approve
dobey (community) Approve
Review via email: mp+157174@code.launchpad.net

Commit message

- rename methods to clarify that a completionBlock param will be run on the main thread, and remove redundant dispatches

Description of the change

- refactor: make clearer what code is running on what queue

Rename several methods with completionBlock parameters to clarify that the passed-in block is going to be run on the main queue. In most cases, the block is passed along un-executed until it is finally run by U1FilesService -execute:toURL:requestBody... etc

Also change behavior of uploadContentData to guarantee running its block arg on the main queue, and rename to reflect that.

This change makes it easier to audit calling code's use of NSManagedObjects (which have to be thread-confined) and any UI calls, which have to be on the main thread. As a result I've also removed some redundant dispatch blocks that were probably added because it wasn't clear earlier what was being run where.

To post a comment you must log in.
Revision history for this message
dobey (dobey) wrote :

Lots of conflict markers showing in the diff.

review: Needs Fixing
79. By Mike McCracken

poke LP again

Revision history for this message
Brian Curtin (brian.curtin) wrote :

Conflict markers remain

review: Needs Fixing
80. By Mike McCracken

merge with trunk

81. By Mike McCracken

merge with trunk

Revision history for this message
dobey (dobey) :
review: Approve
Revision history for this message
Brian Curtin (brian.curtin) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'Files/U1AutoUploadOperation.m'
--- Files/U1AutoUploadOperation.m 2013-03-29 22:44:58 +0000
+++ Files/U1AutoUploadOperation.m 2013-04-04 21:20:29 +0000
@@ -86,22 +86,19 @@
86 86
87 [[U1FilesClient sharedFilesClient] uploadAssetURL:self.assetURL toFolder:folder withResourceName:self.filename withPriority:self.priority progressBlock:^(long long bytesUploaded, long long totalBytes) {87 [[U1FilesClient sharedFilesClient] uploadAssetURL:self.assetURL toFolder:folder withResourceName:self.filename withPriority:self.priority progressBlock:^(long long bytesUploaded, long long totalBytes) {
88 88
89 } completionBlock:^(U1FileNode *fileNode, NSError *error) {89 } completionBlockOnMainQueue:^(U1FileNode *fileNode, NSError *error) {
90 if (error != nil)90 if (error != nil)
91 {91 {
92 NSLog(@"U1AutoUploadOperation: auto-upload failed: %@", error);92 NSLog(@"U1AutoUploadOperation: auto-upload failed: %@", error);
93 }93 }
94 94
95 dispatch_async(dispatch_get_main_queue(), ^(void) {95 asset.generation = asset.fileNode.generation;
96 96 NSError *err = NULL;
97 asset.generation = asset.fileNode.generation;97 BOOL success = [dataRepository save:&err];
98 NSError *err = NULL;98 if(!success){
99 BOOL success = [dataRepository save:&err];99 CLS_LOG(@"U1AutoUploadOperation: failed to save to repository: %@", err);
100 if(!success){100 }
101 CLS_LOG(@"U1AutoUploadOperation: failed to save to repository: %@", err);101 [self finishExecuting];
102 }
103 [self finishExecuting];
104 });
105 }];102 }];
106 103
107 }];104 }];
108105
=== modified file 'Files/U1AutoUploadsManager.m'
--- Files/U1AutoUploadsManager.m 2013-04-03 23:07:08 +0000
+++ Files/U1AutoUploadsManager.m 2013-04-04 21:20:29 +0000
@@ -177,7 +177,7 @@
177 creatingUploadVolume = YES;177 creatingUploadVolume = YES;
178 178
179 [self.filesClient createVolumeAtPath:[self remoteUploadFolderPath]179 [self.filesClient createVolumeAtPath:[self remoteUploadFolderPath]
180 completionBlock:^(U1Volume *volume, NSError *error) {180 completionBlockOnMainQueue:^(U1Volume *volume, NSError *error) {
181 creatingUploadVolume = NO;181 creatingUploadVolume = NO;
182 if (error == nil)182 if (error == nil)
183 {183 {
184184
=== modified file 'Files/U1FileDetailsViewController.m'
--- Files/U1FileDetailsViewController.m 2013-04-03 23:01:10 +0000
+++ Files/U1FileDetailsViewController.m 2013-04-04 21:20:29 +0000
@@ -229,12 +229,10 @@
229 if (![sender isOn] && [self.node isPublicValue])229 if (![sender isOn] && [self.node isPublicValue])
230 {230 {
231 [self.publishStatusLabel setText:NSLocalizedString(@"Unpublishing file...", nil)];231 [self.publishStatusLabel setText:NSLocalizedString(@"Unpublishing file...", nil)];
232 [self.filesClient unpublishNode:self.node completionBlock:^(U1FileNode *node, NSError *error) {232 [self.filesClient unpublishNode:self.node completionBlockOnMainQueue:^(U1FileNode *node, NSError *error) {
233 dispatch_async(dispatch_get_main_queue(), ^(void) {233 [sender setEnabled:YES];
234 [sender setEnabled:YES];234 [self.publishStatusLabel setText:nil];
235 [self.publishStatusLabel setText:nil];235 [self.actionsTableView deleteRowsAtIndexPaths:publishStatusIndexPath withRowAnimation:UITableViewRowAnimationFade];
236 [self.actionsTableView deleteRowsAtIndexPaths:publishStatusIndexPath withRowAnimation:UITableViewRowAnimationFade];
237 });
238 }];236 }];
239 }237 }
240 else if ([sender isOn] && ![self.node isPublicValue])238 else if ([sender isOn] && ![self.node isPublicValue])
@@ -243,14 +241,12 @@
243 [self.publishStatusLabel setText:NSLocalizedString(@"Publishing file...", nil)];241 [self.publishStatusLabel setText:NSLocalizedString(@"Publishing file...", nil)];
244 [self.actionsTableView insertRowsAtIndexPaths:publishStatusIndexPath withRowAnimation:UITableViewRowAnimationNone];242 [self.actionsTableView insertRowsAtIndexPaths:publishStatusIndexPath withRowAnimation:UITableViewRowAnimationNone];
245 [self.actionsTableView endUpdates];243 [self.actionsTableView endUpdates];
246 [self.filesClient publishNode:self.node completionBlock:^(U1FileNode *node, NSError *error) {244 [self.filesClient publishNode:self.node completionBlockOnMainQueue:^(U1FileNode *node, NSError *error) {
247 dispatch_async(dispatch_get_main_queue(), ^(void) {245 [sender setEnabled:YES];
248 [sender setEnabled:YES];246 [self.actionsTableView beginUpdates];
249 [self.actionsTableView beginUpdates];247 [self.publishStatusLabel setText:[self.node publicURLString]];
250 [self.publishStatusLabel setText:[self.node publicURLString]];248 [self.actionsTableView reloadRowsAtIndexPaths:publishStatusIndexPath withRowAnimation:UITableViewRowAnimationNone];
251 [self.actionsTableView reloadRowsAtIndexPaths:publishStatusIndexPath withRowAnimation:UITableViewRowAnimationNone];249 [self.actionsTableView endUpdates];
252 [self.actionsTableView endUpdates];
253 });
254 }];250 }];
255 }251 }
256}252}
@@ -394,11 +390,11 @@
394 if (!newName)390 if (!newName)
395 return;391 return;
396392
397 [[U1FilesClient sharedFilesClient] renameNode:self.node toName:newName completionBlock:^(U1Node *newNode, NSError *error) {393 [[U1FilesClient sharedFilesClient] renameNode:self.node toName:newName completionBlockOnMainQueue:^(U1Node *newNode, NSError *error) {
398 394
399 if (!error)395 if (!error)
400 {396 {
401 self.title = [node.path lastPathComponent];397 self.title = [newNode.path lastPathComponent];
402 UILabel *titleLabel = (UILabel*)[self.navigationItem titleView];398 UILabel *titleLabel = (UILabel*)[self.navigationItem titleView];
403 [titleLabel setText:self.title];399 [titleLabel setText:self.title];
404 [titleLabel sizeToFit];400 [titleLabel sizeToFit];
405401
=== modified file 'Files/U1FilesClient.h'
--- Files/U1FilesClient.h 2012-08-07 14:18:15 +0000
+++ Files/U1FilesClient.h 2013-04-04 21:20:29 +0000
@@ -36,13 +36,13 @@
36- (id)volumesWithResultsBlock:(void(^)(U1Volume *rootVolume, NSFetchedResultsController *cloudFoldersResultsController, U1DataSourceType resultsDataSourceType))resultsBlock errorBlock:(void(^)(NSError *error))errorBlock;36- (id)volumesWithResultsBlock:(void(^)(U1Volume *rootVolume, NSFetchedResultsController *cloudFoldersResultsController, U1DataSourceType resultsDataSourceType))resultsBlock errorBlock:(void(^)(NSError *error))errorBlock;
37- (id)fetchFolderWithResourcePath:(NSString*)nodePath resultsBlock:(void(^)(U1Node *node, NSFetchedResultsController *childrenResultsController, U1DataSourceType resultsDataSourceType))resultsBlock errorBlock:(void(^)(NSError *error))errorBlock;37- (id)fetchFolderWithResourcePath:(NSString*)nodePath resultsBlock:(void(^)(U1Node *node, NSFetchedResultsController *childrenResultsController, U1DataSourceType resultsDataSourceType))resultsBlock errorBlock:(void(^)(NSError *error))errorBlock;
38- (id)fetchFileWithResourcePath:(NSString*)nodePath completionBlock:(void(^)(U1Node *node, NSError *error))completionBlock;38- (id)fetchFileWithResourcePath:(NSString*)nodePath completionBlock:(void(^)(U1Node *node, NSError *error))completionBlock;
39- (id)renameNode:(U1Node*)node toName:(NSString*)newName completionBlock:(void(^)(U1Node *node, NSError *error))completionBlock;39- (id)renameNode:(U1Node*)node toName:(NSString*)newName completionBlockOnMainQueue:(void(^)(U1Node *node, NSError *error))completionBlock;
40- (id)deleteNode:(U1Node*)node completionBlock:(void(^)(NSError *error))completionBlock;40- (id)deleteNode:(U1Node*)node completionBlock:(void(^)(NSError *error))completionBlock;
41- (id)uploadAssetURL:(NSURL*)assetURL toFolder:(U1FolderNode*)folderNode withResourceName:(NSString*)resourceName withPriority:(NSOperationQueuePriority)priority progressBlock:(void(^)(long long bytesUploaded, long long totalBytes))progressBlock completionBlock:(void(^)(U1FileNode *updatedNode, NSError *error))completionBlock;41- (id)uploadAssetURL:(NSURL*)assetURL toFolder:(U1FolderNode*)folderNode withResourceName:(NSString*)resourceName withPriority:(NSOperationQueuePriority)priority progressBlock:(void(^)(long long bytesUploaded, long long totalBytes))progressBlock completionBlockOnMainQueue:(void(^)(U1FileNode *updatedNode, NSError *error))completionBlock;
42- (id)publishNode:(U1FileNode*)node completionBlock:(void(^)(U1FileNode *node, NSError *error))completionBlock;42- (id)publishNode:(U1FileNode*)node completionBlockOnMainQueue:(void(^)(U1FileNode *node, NSError *error))completionBlock;
43- (id)unpublishNode:(U1FileNode*)node completionBlock:(void(^)(U1FileNode *node, NSError *error))completionBlock;43- (id)unpublishNode:(U1FileNode*)node completionBlockOnMainQueue:(void(^)(U1FileNode *node, NSError *error))completionBlock;
44- (id)createFolderNamed:(NSString*)name inFolder:(U1FolderNode*)folderNode completionBlock:(void(^)(U1FolderNode *newFolderNode, NSError *error))completionBlock;44- (id)createFolderNamed:(NSString*)name inFolder:(U1FolderNode*)folderNode completionBlockOnMainQueue:(void(^)(U1FolderNode *newFolderNode, NSError *error))completionBlock;
45- (id)createVolumeAtPath:(NSString*)folderPath completionBlock:(void(^)(U1Volume *volume, NSError *error))completionBlock;45- (id)createVolumeAtPath:(NSString*)folderPath completionBlockOnMainQueue:(void(^)(U1Volume *volume, NSError *error))completionBlock;
46- (BOOL)isNodeSavedLocally:(U1FileNode*)node;46- (BOOL)isNodeSavedLocally:(U1FileNode*)node;
47- (U1LocalFileInfo*)localInfoForNode:(U1FileNode*)node;47- (U1LocalFileInfo*)localInfoForNode:(U1FileNode*)node;
48- (U1LocalFileInfo*)downloadFileForNode:(U1FileNode*)node completionBlock:(void(^)(NSError *error))completionBlock;48- (U1LocalFileInfo*)downloadFileForNode:(U1FileNode*)node completionBlock:(void(^)(NSError *error))completionBlock;
4949
=== modified file 'Files/U1FilesClient.m'
--- Files/U1FilesClient.m 2013-03-29 22:44:58 +0000
+++ Files/U1FilesClient.m 2013-04-04 21:20:29 +0000
@@ -106,7 +106,7 @@
106106
107- (id)accountInfoWithCompletionBlock:(void(^)(NSDictionary *accountInfo, NSError *error))completionBlock;107- (id)accountInfoWithCompletionBlock:(void(^)(NSDictionary *accountInfo, NSError *error))completionBlock;
108{108{
109 return [self.filesService accountInfoWithCompletionBlock:completionBlock];109 return [self.filesService accountInfoWithCompletionBlockOnMainQueue:completionBlock];
110}110}
111111
112- (id)volumesWithResultsBlock:(void(^)(U1Volume *rootVolume, NSFetchedResultsController *cloudFoldersResultsController, U1DataSourceType resultsDataSourceType))resultsBlock errorBlock:(void(^)(NSError *error))errorBlock;112- (id)volumesWithResultsBlock:(void(^)(U1Volume *rootVolume, NSFetchedResultsController *cloudFoldersResultsController, U1DataSourceType resultsDataSourceType))resultsBlock errorBlock:(void(^)(NSError *error))errorBlock;
@@ -142,7 +142,7 @@
142 142
143 resultsBlock(rootVolume, cloudFoldersResultsController, U1DataSourceLocal);143 resultsBlock(rootVolume, cloudFoldersResultsController, U1DataSourceLocal);
144 144
145 [self.filesService volumeInfoWithCompletionBlock:^(NSArray *volumeInfos, NSError *error) {145 [self.filesService volumeInfoWithCompletionBlockOnMainQueue:^(NSArray *volumeInfos, NSError *error) {
146 146
147 [self.dataRepository dispatchBlockWithMainContext:^(NSManagedObjectContext *context) {147 [self.dataRepository dispatchBlockWithMainContext:^(NSManagedObjectContext *context) {
148 148
@@ -236,11 +236,11 @@
236 236
237 resultsBlock(node, resultsController, U1DataSourceLocal);237 resultsBlock(node, resultsController, U1DataSourceLocal);
238 238
239 [self.filesService infoForNodeAtResourcePath:node.resourcePath includeChildren:YES completionBlock:^(NSDictionary *nodeInfo, NSError *error) {239 [self.filesService infoForNodeAtResourcePath:node.resourcePath includeChildren:YES completionBlockOnMainQueue:^(NSDictionary *nodeInfo, NSError *error) {
240240
241 if (error)241 if (error)
242 {242 {
243 CLS_LOG(@"error from call to filesService infoForNodeAtResourcePath:...");243 CLS_LOG(@"error from call to filesService infoForNodeAtResourcePath:. %@", error);
244 errorBlock(error);244 errorBlock(error);
245 return;245 return;
246 }246 }
@@ -334,7 +334,7 @@
334 }334 }
335 335
336 336
337 [self.filesService infoForNodeAtResourcePath:node.resourcePath includeChildren:NO completionBlock:^(NSDictionary *nodeInfo, NSError *error) {337 [self.filesService infoForNodeAtResourcePath:node.resourcePath includeChildren:NO completionBlockOnMainQueue:^(NSDictionary *nodeInfo, NSError *error) {
338 if (error == nil)338 if (error == nil)
339 {339 {
340 [node updatePropertiesFromJSONDictionary:nodeInfo];340 [node updatePropertiesFromJSONDictionary:nodeInfo];
@@ -350,14 +350,14 @@
350 return nil;350 return nil;
351}351}
352352
353- (id)renameNode:(U1Node*)node toName:(NSString*)newName completionBlock:(void(^)(U1Node *node, NSError *error))completionBlock;353- (id)renameNode:(U1Node*)node toName:(NSString*)newName completionBlockOnMainQueue:(void(^)(U1Node *node, NSError *error))completionBlock;
354{354{
355 NSParameterAssert(node != nil);355 NSParameterAssert(node != nil);
356 NSParameterAssert(newName != nil);356 NSParameterAssert(newName != nil);
357 NSParameterAssert(completionBlock != NULL);357 NSParameterAssert(completionBlock != NULL);
358 358
359 NSString *newPath = [[node.path stringByDeletingLastPathComponent] stringByAppendingPathComponent:newName];359 NSString *newPath = [[node.path stringByDeletingLastPathComponent] stringByAppendingPathComponent:newName];
360 return [self.filesService moveNodeAtResourcePath:node.resourcePath toPath:newPath withCompletionBlock:^(NSDictionary *nodeInfo, NSError *error) {360 return [self.filesService moveNodeAtResourcePath:node.resourcePath toPath:newPath withCompletionBlockOnMainQueue:^(NSDictionary *nodeInfo, NSError *error) {
361 if (!error)361 if (!error)
362 {362 {
363 [node updatePropertiesFromJSONDictionary:nodeInfo];363 [node updatePropertiesFromJSONDictionary:nodeInfo];
@@ -368,7 +368,7 @@
368368
369- (id)deleteNode:(U1Node*)node completionBlock:(void(^)(NSError *error))completionBlock;369- (id)deleteNode:(U1Node*)node completionBlock:(void(^)(NSError *error))completionBlock;
370{370{
371 return [self.filesService deleteNodeAtResourcePath:node.resourcePath completionBlock:^(NSError *error) {371 return [self.filesService deleteNodeAtResourcePath:node.resourcePath completionBlockOnMainQueue:^(NSError *error) {
372 if (!error)372 if (!error)
373 {373 {
374 [self.dataRepository dispatchBlockWithMainContext:^(NSManagedObjectContext *context) {374 [self.dataRepository dispatchBlockWithMainContext:^(NSManagedObjectContext *context) {
@@ -380,10 +380,10 @@
380 }];380 }];
381}381}
382382
383- (id)uploadAssetURL:(NSURL*)assetURL toFolder:(U1FolderNode *)folderNode withResourceName:(NSString *)resourceName withPriority:(NSOperationQueuePriority)priority progressBlock:(void (^)(long long, long long))progressBlock completionBlock:(void (^)(U1FileNode *, NSError *))completionBlock;383- (id)uploadAssetURL:(NSURL*)assetURL toFolder:(U1FolderNode *)folderNode withResourceName:(NSString *)resourceName withPriority:(NSOperationQueuePriority)priority progressBlock:(void (^)(long long, long long))progressBlock completionBlockOnMainQueue:(void (^)(U1FileNode *, NSError *))completionBlock;
384{384{
385 NSString *resourcePath = [folderNode.resourcePath stringByAppendingPathComponent:resourceName];385 NSString *resourcePath = [folderNode.resourcePath stringByAppendingPathComponent:resourceName];
386 U1FileNode *node = (id)[self.dataRepository nodeWithResourcePath:resourcePath];386 U1FileNode *node = (id)[self.dataRepository nodeWithResourcePath:resourcePath]; // node will be from main context , on main Q
387 if (!node)387 if (!node)
388 {388 {
389 [self.dataRepository dispatchBlockWithMainContext:^(NSManagedObjectContext *context) {389 [self.dataRepository dispatchBlockWithMainContext:^(NSManagedObjectContext *context) {
@@ -442,17 +442,17 @@
442 return operation;442 return operation;
443}443}
444444
445- (id)publishNode:(U1FileNode*)node completionBlock:(void(^)(U1FileNode *node, NSError *error))completionBlock;445- (id)publishNode:(U1FileNode*)node completionBlockOnMainQueue:(void(^)(U1FileNode *node, NSError *error))completionBlock;
446{446{
447 return [self.filesService publishNode:node completionBlock:completionBlock];447 return [self.filesService publishNode:node completionBlockOnMainQueue:completionBlock];
448}448}
449449
450- (id)unpublishNode:(U1FileNode*)node completionBlock:(void(^)(U1FileNode *node, NSError *error))completionBlock;450- (id)unpublishNode:(U1FileNode*)node completionBlockOnMainQueue:(void(^)(U1FileNode *node, NSError *error))completionBlock;
451{451{
452 return [self.filesService unpublishNode:node completionBlock:completionBlock];452 return [self.filesService unpublishNode:node completionBlockOnMainQueue:completionBlock];
453}453}
454454
455- (id)createFolderNamed:(NSString*)name inFolder:(U1FolderNode*)folderNode completionBlock:(void(^)(U1FolderNode *newFolderNode, NSError *error))completionBlock;455- (id)createFolderNamed:(NSString*)name inFolder:(U1FolderNode*)folderNode completionBlockOnMainQueue:(void(^)(U1FolderNode *newFolderNode, NSError *error))completionBlock;
456{456{
457 NSString *resourcePath = folderNode.resourcePath;457 NSString *resourcePath = folderNode.resourcePath;
458 resourcePath = [resourcePath stringByAppendingPathComponent:name];458 resourcePath = [resourcePath stringByAppendingPathComponent:name];
@@ -471,7 +471,7 @@
471 node = (id)[self.dataRepository nodeWithResourcePath:resourcePath];471 node = (id)[self.dataRepository nodeWithResourcePath:resourcePath];
472 }472 }
473 473
474 return [self.filesService createFolderAtPath:resourcePath completionBlock:^(NSDictionary *nodeInfo, NSError *error) {474 return [self.filesService createFolderAtPath:resourcePath completionBlockOnMainQueue:^(NSDictionary *nodeInfo, NSError *error) {
475 if (!error)475 if (!error)
476 {476 {
477 [node updatePropertiesFromJSONDictionary:nodeInfo];477 [node updatePropertiesFromJSONDictionary:nodeInfo];
@@ -480,9 +480,9 @@
480 }];480 }];
481}481}
482482
483- (id)createVolumeAtPath:(NSString*)folderPath completionBlock:(void(^)(U1Volume *volume, NSError *error))completionBlock;483- (id)createVolumeAtPath:(NSString*)folderPath completionBlockOnMainQueue:(void(^)(U1Volume *volume, NSError *error))completionBlock;
484{484{
485 return [self.filesService createVolumeAtPath:folderPath completionBlock:^(NSDictionary *volumeInfo, NSError *error) {485 return [self.filesService createVolumeAtPath:folderPath completionBlockOnMainQueue:^(NSDictionary *volumeInfo, NSError *error) {
486 [self.dataRepository dispatchBlockWithMainContext:^(NSManagedObjectContext *context) {486 [self.dataRepository dispatchBlockWithMainContext:^(NSManagedObjectContext *context) {
487 U1Volume *volume = [U1Volume insertInManagedObjectContext:context];487 U1Volume *volume = [U1Volume insertInManagedObjectContext:context];
488 if (!error)488 if (!error)
489489
=== modified file 'Files/U1FilesService.h'
--- Files/U1FilesService.h 2012-08-07 14:19:47 +0000
+++ Files/U1FilesService.h 2013-04-04 21:20:29 +0000
@@ -28,17 +28,17 @@
2828
29+ (U1FilesService *)sharedFilesService;29+ (U1FilesService *)sharedFilesService;
3030
31- (id)accountInfoWithCompletionBlock:(void(^)(NSDictionary *accountInfo, NSError *error))completionBlock;31- (id)accountInfoWithCompletionBlockOnMainQueue:(void(^)(NSDictionary *accountInfo, NSError *error))completionBlock;
32- (id)volumeInfoWithCompletionBlock:(void(^)(NSArray *volumeInfos, NSError *error))completionBlock;32- (id)volumeInfoWithCompletionBlockOnMainQueue:(void(^)(NSArray *volumeInfos, NSError *error))completionBlock;
33- (id)infoForNodeAtResourcePath:(NSString*)resourcePath includeChildren:(BOOL)includeChildren completionBlock:(void(^)(NSDictionary *node, NSError *error))completionBlock;33- (id)infoForNodeAtResourcePath:(NSString*)resourcePath includeChildren:(BOOL)includeChildren completionBlockOnMainQueue:(void(^)(NSDictionary *node, NSError *error))completionBlock;
34- (id)infoForNode:(U1Node*)node includeChildren:(BOOL)includeChildren completionBlock:(void(^)(NSDictionary *node, NSError *error))completionBlock;34- (id)infoForNode:(U1Node*)node includeChildren:(BOOL)includeChildren completionBlockOnMainQueue:(void(^)(NSDictionary *node, NSError *error))completionBlock;
35- (id)contentForNode:(U1FileNode*)node progressBlock:(void(^)(long long bytesReceived, long long bytesExpected))progressBlock completionBlock:(void(^)(NSURL *contentURL))completionBlock;35- (id)contentForNode:(U1FileNode*)node progressBlock:(void(^)(long long bytesReceived, long long bytesExpected))progressBlock completionBlock:(void(^)(NSURL *contentURL))completionBlock;
36- (id)uploadContentData:(id<U1UploadDataProvider>)contentData forNode:(U1FileNode*)node progressBlock:(void(^)(long long bytesUploaded, long long totalBytes))progressBlock completionBlock:(void(^)(NSDictionary *updatedNodeInfo, NSError *error))completionBlock;36- (id)uploadContentData:(id<U1UploadDataProvider>)contentData forNode:(U1FileNode*)node progressBlock:(void(^)(long long bytesUploaded, long long totalBytes))progressBlock completionBlockOnMainQueue:(void(^)(NSDictionary *updatedNodeInfo, NSError *error))completionBlock;
37- (id)moveNodeAtResourcePath:(NSString*)resourcePath toPath:(NSString*)newPath withCompletionBlock:(void(^)(NSDictionary *nodeInfo, NSError *error))completionBlock;37- (id)moveNodeAtResourcePath:(NSString*)resourcePath toPath:(NSString*)newPath withCompletionBlockOnMainQueue:(void(^)(NSDictionary *nodeInfo, NSError *error))completionBlock;
38- (id)deleteNodeAtResourcePath:(NSString*)resourcePath completionBlock:(void(^)(NSError *error))completionBlock;38- (id)deleteNodeAtResourcePath:(NSString*)resourcePath completionBlockOnMainQueue:(void(^)(NSError *error))completionBlock;
39- (id)publishNode:(U1FileNode*)node completionBlock:(void(^)(U1FileNode *node, NSError *error))completionBlock;39- (id)publishNode:(U1FileNode*)node completionBlockOnMainQueue:(void(^)(U1FileNode *node, NSError *error))completionBlock;
40- (id)unpublishNode:(U1FileNode*)node completionBlock:(void(^)(U1FileNode *node, NSError *error))completionBlock;40- (id)unpublishNode:(U1FileNode*)node completionBlockOnMainQueue:(void(^)(U1FileNode *node, NSError *error))completionBlock;
41- (id)createFolderAtPath:(NSString*)folderPath completionBlock:(void(^)(NSDictionary *nodeInfo, NSError *error))completionBlock;41- (id)createFolderAtPath:(NSString*)folderPath completionBlockOnMainQueue:(void(^)(NSDictionary *nodeInfo, NSError *error))completionBlock;
42- (id)createVolumeAtPath:(NSString*)folderPath completionBlock:(void(^)(NSDictionary *volumeInfo, NSError *error))completionBlock;42- (id)createVolumeAtPath:(NSString*)folderPath completionBlockOnMainQueue:(void(^)(NSDictionary *volumeInfo, NSError *error))completionBlock;
4343
44@end44@end
4545
=== modified file 'Files/U1FilesService.m'
--- Files/U1FilesService.m 2013-04-04 19:10:31 +0000
+++ Files/U1FilesService.m 2013-04-04 21:20:29 +0000
@@ -37,8 +37,8 @@
37- (NSURL*)URLForVolumeWithPath:(NSString*)volumePath;37- (NSURL*)URLForVolumeWithPath:(NSString*)volumePath;
38- (NSURL*)URLForNode:(NSString*)nodePath includeChildren:(BOOL)includeChildren;38- (NSURL*)URLForNode:(NSString*)nodePath includeChildren:(BOOL)includeChildren;
39- (NSURL*)contentURLForNode:(NSString*)nodePath;39- (NSURL*)contentURLForNode:(NSString*)nodePath;
40- (id)execute:(NSString*)method toURL:(NSURL*)url requestBody:(NSString*)body parseResponseBody:(BOOL)parseResponseBody completionBlock:(void(^)(id results, NSError *error))completionBlock;40- (id)execute:(NSString*)method toURL:(NSURL*)url requestBody:(NSString*)body parseResponseBody:(BOOL)parseResponseBody completionBlockOnMainQueue:(void(^)(id results, NSError *error))completionBlock;
41- (id)execute:(NSString*)method toURL:(NSURL*)url requestBody:(id)bodyData contentType:(NSString*)contentType contentLength:(NSUInteger)contentLength parseResponseBody:(BOOL)parseResponseBody completionBlock:(void(^)(id results, NSError *error))completionBlock;41- (id)execute:(NSString*)method toURL:(NSURL*)url requestBody:(id)bodyData contentType:(NSString*)contentType contentLength:(NSUInteger)contentLength parseResponseBody:(BOOL)parseResponseBody completionBlockOnMainQueue:(void(^)(id results, NSError *error))completionBlock;
4242
43@end43@end
4444
@@ -81,38 +81,38 @@
81 [super dealloc];81 [super dealloc];
82}82}
8383
84- (id)accountInfoWithCompletionBlock:(void(^)(NSDictionary *accountInfo, NSError *error))completionBlock;84- (id)accountInfoWithCompletionBlockOnMainQueue:(void(^)(NSDictionary *accountInfo, NSError *error))completionBlock;
85{85{
86 NSMutableString *urlString = [NSMutableString stringWithString:U1FilesServiceAPIBase];86 NSMutableString *urlString = [NSMutableString stringWithString:U1FilesServiceAPIBase];
87 [urlString appendString:U1FilesServiceAPIPath];87 [urlString appendString:U1FilesServiceAPIPath];
88 [urlString appendString:U1FilesServiceAPIVersion1];88 [urlString appendString:U1FilesServiceAPIVersion1];
89 NSURL *rootURL = [NSURL URLWithString:urlString];89 NSURL *rootURL = [NSURL URLWithString:urlString];
90 return [self execute:@"GET" toURL:rootURL requestBody:nil parseResponseBody:YES completionBlock:^(id results, NSError *error) {90 return [self execute:@"GET" toURL:rootURL requestBody:nil parseResponseBody:YES completionBlockOnMainQueue:^(id results, NSError *error) {
91 completionBlock(results, error);91 completionBlock(results, error);
92 }];92 }];
93}93}
9494
95- (id)volumeInfoWithCompletionBlock:(void(^)(NSArray *volumeInfos, NSError *error))completionBlock;95- (id)volumeInfoWithCompletionBlockOnMainQueue:(void(^)(NSArray *volumeInfos, NSError *error))completionBlock;
96{96{
97 NSURL *volumesURL = [self URLForNode:@"/volumes" includeChildren:NO];97 NSURL *volumesURL = [self URLForNode:@"/volumes" includeChildren:NO];
98 return [self execute:@"GET" toURL:volumesURL requestBody:nil parseResponseBody:YES completionBlock:^(id results, NSError *error) {98 return [self execute:@"GET" toURL:volumesURL requestBody:nil parseResponseBody:YES completionBlockOnMainQueue:^(id results, NSError *error) {
99 completionBlock(results, error);99 completionBlock(results, error);
100 }];100 }];
101}101}
102102
103- (id)infoForNodeAtResourcePath:(NSString*)resourcePath includeChildren:(BOOL)includeChildren completionBlock:(void(^)(NSDictionary *node, NSError *error))completionBlock;103- (id)infoForNodeAtResourcePath:(NSString*)resourcePath includeChildren:(BOOL)includeChildren completionBlockOnMainQueue:(void(^)(NSDictionary *node, NSError *error))completionBlock;
104{104{
105 NSURL *nodeURL = [self URLForNode:resourcePath includeChildren:includeChildren];105 NSURL *nodeURL = [self URLForNode:resourcePath includeChildren:includeChildren];
106106
107 return [self execute:@"GET" toURL:nodeURL requestBody:nil parseResponseBody:YES completionBlock:^(id result, NSError *error) {107 return [self execute:@"GET" toURL:nodeURL requestBody:nil parseResponseBody:YES completionBlockOnMainQueue:^(id result, NSError *error) {
108 108
109 completionBlock(result, error);109 completionBlock(result, error);
110 }];110 }];
111}111}
112112
113- (id)infoForNode:(U1Node*)node includeChildren:(BOOL)includeChildren completionBlock:(void(^)(NSDictionary *node, NSError *error))completionBlock;113- (id)infoForNode:(U1Node*)node includeChildren:(BOOL)includeChildren completionBlockOnMainQueue:(void(^)(NSDictionary *node, NSError *error))completionBlock;
114{114{
115 return [self infoForNodeAtResourcePath:node.resourcePath includeChildren:includeChildren completionBlock:completionBlock];115 return [self infoForNodeAtResourcePath:node.resourcePath includeChildren:includeChildren completionBlockOnMainQueue:completionBlock];
116}116}
117117
118- (id)contentForNode:(U1FileNode*)node progressBlock:(void(^)(long long bytesReceived, long long bytesExpected))progressBlock completionBlock:(void(^)(NSURL *contentURL))completionBlock;118- (id)contentForNode:(U1FileNode*)node progressBlock:(void(^)(long long bytesReceived, long long bytesExpected))progressBlock completionBlock:(void(^)(NSURL *contentURL))completionBlock;
@@ -170,7 +170,7 @@
170 return nil;170 return nil;
171}171}
172172
173- (id)uploadContentData:(id<U1UploadDataProvider>)contentData forNode:(U1FileNode*)node progressBlock:(void(^)(long long bytesUploaded, long long totalBytes))progressBlock completionBlock:(void(^)(NSDictionary *updatedNodeInfo, NSError *error))completionBlock;173- (id)uploadContentData:(id<U1UploadDataProvider>)contentData forNode:(U1FileNode*)node progressBlock:(void(^)(long long bytesUploaded, long long totalBytes))progressBlock completionBlockOnMainQueue:(void(^)(NSDictionary *updatedNodeInfo, NSError *error))completionBlock;
174{174{
175 NSString *resourcePath = node.resourcePath;175 NSString *resourcePath = node.resourcePath;
176 NSURL *requestURL = [contentData isMagic] ? [self URLForNode:resourcePath includeChildren:NO] : [self contentURLForNode:resourcePath];176 NSURL *requestURL = [contentData isMagic] ? [self URLForNode:resourcePath includeChildren:NO] : [self contentURLForNode:resourcePath];
@@ -179,14 +179,16 @@
179 179
180 if (error)180 if (error)
181 {181 {
182 completionBlock(nil, error);182 dispatch_async(dispatch_get_main_queue(), ^{
183 completionBlock(nil, error);
184 });
183 return;185 return;
184 }186 }
185 187
186 U1ReportingInputStream *stream = [U1ReportingInputStream inputStreamWithSourceStream:dataStream];188 U1ReportingInputStream *stream = [U1ReportingInputStream inputStreamWithSourceStream:dataStream];
187 stream.progressBlock = progressBlock;189 stream.progressBlock = progressBlock;
188 stream.dataLength = length;190 stream.dataLength = length;
189 [self execute:@"PUT" toURL:requestURL requestBody:stream contentType:mimeType contentLength:length parseResponseBody:YES completionBlock:^(id results, NSError *error) {191 [self execute:@"PUT" toURL:requestURL requestBody:stream contentType:mimeType contentLength:length parseResponseBody:YES completionBlockOnMainQueue:^(id results, NSError *error) {
190 completionBlock(results, error);192 completionBlock(results, error);
191 }];193 }];
192 }];194 }];
@@ -194,7 +196,7 @@
194 return nil;196 return nil;
195}197}
196198
197- (id)moveNodeAtResourcePath:(NSString*)resourcePath toPath:(NSString*)newPath withCompletionBlock:(void(^)(NSDictionary *nodeInfo, NSError *error))completionBlock;199- (id)moveNodeAtResourcePath:(NSString*)resourcePath toPath:(NSString*)newPath withCompletionBlockOnMainQueue:(void(^)(NSDictionary *nodeInfo, NSError *error))completionBlock;
198{200{
199 NSParameterAssert(resourcePath != nil);201 NSParameterAssert(resourcePath != nil);
200 NSParameterAssert(newPath != nil);202 NSParameterAssert(newPath != nil);
@@ -202,65 +204,65 @@
202 204
203 NSURL *nodeURL = [self URLForNode:resourcePath includeChildren:NO];205 NSURL *nodeURL = [self URLForNode:resourcePath includeChildren:NO];
204 NSString *body = [NSString stringWithFormat:@"{\"path\": \"%@\"}", newPath];206 NSString *body = [NSString stringWithFormat:@"{\"path\": \"%@\"}", newPath];
205 return [self execute:@"PUT" toURL:nodeURL requestBody:body parseResponseBody:YES completionBlock:^(id results, NSError *error) {207 return [self execute:@"PUT" toURL:nodeURL requestBody:body parseResponseBody:YES completionBlockOnMainQueue:^(id results, NSError *error) {
206 completionBlock(results, error);208 completionBlock(results, error);
207 }];209 }];
208}210}
209211
210- (id)deleteNodeAtResourcePath:(NSString*)resourcePath completionBlock:(void(^)(NSError *error))completionBlock;212- (id)deleteNodeAtResourcePath:(NSString*)resourcePath completionBlockOnMainQueue:(void(^)(NSError *error))completionBlock;
211{213{
212 NSURL *nodeURL = [self URLForNode:resourcePath includeChildren:NO];214 NSURL *nodeURL = [self URLForNode:resourcePath includeChildren:NO];
213 return [self execute:@"DELETE" toURL:nodeURL requestBody:nil parseResponseBody:NO completionBlock:^(id result, NSError *error) {215 return [self execute:@"DELETE" toURL:nodeURL requestBody:nil parseResponseBody:NO completionBlockOnMainQueue:^(id result, NSError *error) {
214 completionBlock(error);216 completionBlock(error);
215 }];217 }];
216}218}
217219
218- (id)publishNode:(U1FileNode*)node completionBlock:(void(^)(U1FileNode *node, NSError *error))completionBlock;220- (id)publishNode:(U1FileNode*)node completionBlockOnMainQueue:(void(^)(U1FileNode *node, NSError *error))completionBlock;
219{221{
220 NSString *nodePath = node.resourcePath;222 NSString *nodePath = node.resourcePath;
221 NSURL *nodeURL = [self URLForNode:(NSString*)nodePath includeChildren:NO];223 NSURL *nodeURL = [self URLForNode:(NSString*)nodePath includeChildren:NO];
222 return [self execute:@"PUT" toURL:nodeURL requestBody:@"{\"is_public\": true}" parseResponseBody:YES completionBlock:^(id result, NSError *error) {224 return [self execute:@"PUT" toURL:nodeURL requestBody:@"{\"is_public\": true}" parseResponseBody:YES completionBlockOnMainQueue:^(id result, NSError *error) {
223225
224 if (!error)226 if (!error)
225 {227 {
226 [node updatePropertiesFromJSONDictionary:result];228 [node updatePropertiesFromJSONDictionary:result];
227 }229 }
228 completionBlock(node, error);230 completionBlock(node, error);
229 }];231 }];
230}232}
231233
232- (id)unpublishNode:(U1FileNode*)node completionBlock:(void(^)(U1FileNode *node, NSError *error))completionBlock;234- (id)unpublishNode:(U1FileNode*)node completionBlockOnMainQueue:(void(^)(U1FileNode *node, NSError *error))completionBlock;
233{235{
234 NSString *nodePath = node.resourcePath;236 NSString *nodePath = node.resourcePath;
235 NSURL *nodeURL = [self URLForNode:(NSString*)nodePath includeChildren:NO];237 NSURL *nodeURL = [self URLForNode:(NSString*)nodePath includeChildren:NO];
236 return [self execute:@"PUT" toURL:nodeURL requestBody:@"{\"is_public\": false}" parseResponseBody:YES completionBlock:^(id result, NSError *error) {238 return [self execute:@"PUT" toURL:nodeURL requestBody:@"{\"is_public\": false}" parseResponseBody:YES completionBlockOnMainQueue:^(id result, NSError *error) {
237239
238 if (!error)240 if (!error)
239 {241 {
240 [node updatePropertiesFromJSONDictionary:result];242 [node updatePropertiesFromJSONDictionary:result];
241 }243 }
242 completionBlock(node, error);244 completionBlock(node, error);
243 }];245 }];
244}246}
245247
246- (id)createFolderAtPath:(NSString*)folderPath completionBlock:(void(^)(NSDictionary *nodeInfo, NSError *error))completionBlock;248- (id)createFolderAtPath:(NSString*)folderPath completionBlockOnMainQueue:(void(^)(NSDictionary *nodeInfo, NSError *error))completionBlock;
247{249{
248 NSParameterAssert(folderPath != nil);250 NSParameterAssert(folderPath != nil);
249 NSParameterAssert(completionBlock != NULL);251 NSParameterAssert(completionBlock != NULL);
250 252
251 NSURL *nodeURL = [self URLForNode:folderPath includeChildren:NO];253 NSURL *nodeURL = [self URLForNode:folderPath includeChildren:NO];
252 return [self execute:@"PUT" toURL:nodeURL requestBody:@"{\"kind\": \"directory\"}" parseResponseBody:YES completionBlock:^(id results, NSError *error) {254 return [self execute:@"PUT" toURL:nodeURL requestBody:@"{\"kind\": \"directory\"}" parseResponseBody:YES completionBlockOnMainQueue:^(id results, NSError *error) {
253 completionBlock(results, error);255 completionBlock(results, error);
254 }];256 }];
255}257}
256258
257- (id)createVolumeAtPath:(NSString*)volumePath completionBlock:(void(^)(NSDictionary *volumeInfo, NSError *error))completionBlock;259- (id)createVolumeAtPath:(NSString*)volumePath completionBlockOnMainQueue:(void(^)(NSDictionary *volumeInfo, NSError *error))completionBlock;
258{260{
259 NSParameterAssert(volumePath != nil);261 NSParameterAssert(volumePath != nil);
260 NSParameterAssert(completionBlock != NULL);262 NSParameterAssert(completionBlock != NULL);
261 263
262 NSURL *volumeURL = [self URLForVolumeWithPath:volumePath];264 NSURL *volumeURL = [self URLForVolumeWithPath:volumePath];
263 return [self execute:@"PUT" toURL:volumeURL requestBody:@"" parseResponseBody:YES completionBlock:^(id results, NSError *error) {265 return [self execute:@"PUT" toURL:volumeURL requestBody:@"" parseResponseBody:YES completionBlockOnMainQueue:^(id results, NSError *error) {
264 completionBlock(results, error);266 completionBlock(results, error);
265 }];267 }];
266}268}
@@ -301,13 +303,13 @@
301 return [NSURL URLWithString:finalString];303 return [NSURL URLWithString:finalString];
302}304}
303305
304- (id)execute:(NSString*)method toURL:(NSURL*)url requestBody:(NSString*)body parseResponseBody:(BOOL)parseResponseBody completionBlock:(void(^)(id results, NSError *error))completionBlock;306- (id)execute:(NSString*)method toURL:(NSURL*)url requestBody:(NSString*)body parseResponseBody:(BOOL)parseResponseBody completionBlockOnMainQueue:(void(^)(id results, NSError *error))completionBlock;
305{307{
306 NSData *bodyData = [body dataUsingEncoding:NSUTF8StringEncoding];308 NSData *bodyData = [body dataUsingEncoding:NSUTF8StringEncoding];
307 return [self execute:method toURL:url requestBody:bodyData contentType:@"application/json" contentLength:[bodyData length] parseResponseBody:parseResponseBody completionBlock:completionBlock];309 return [self execute:method toURL:url requestBody:bodyData contentType:@"application/json" contentLength:[bodyData length] parseResponseBody:parseResponseBody completionBlockOnMainQueue:completionBlock];
308}310}
309311
310- (id)execute:(NSString*)method toURL:(NSURL*)url requestBody:(id)bodyData contentType:(NSString*)contentType contentLength:(NSUInteger)contentLength parseResponseBody:(BOOL)parseResponseBody completionBlock:(void(^)(id results, NSError *error))completionBlock;312- (id)execute:(NSString*)method toURL:(NSURL*)url requestBody:(id)bodyData contentType:(NSString*)contentType contentLength:(NSUInteger)contentLength parseResponseBody:(BOOL)parseResponseBody completionBlockOnMainQueue:(void(^)(id results, NSError *error))completionBlock;
311{313{
312314
313 OAToken *token = [[U1AccountManager sharedAccountManager] oauthToken];315 OAToken *token = [[U1AccountManager sharedAccountManager] oauthToken];
314316
=== modified file 'Files/U1UploadOperation.m'
--- Files/U1UploadOperation.m 2013-04-03 22:52:01 +0000
+++ Files/U1UploadOperation.m 2013-04-04 21:20:29 +0000
@@ -96,7 +96,7 @@
96 [filesService uploadContentData:dataProvider96 [filesService uploadContentData:dataProvider
97 forNode:self.fileNode97 forNode:self.fileNode
98 progressBlock:^(long long uploaded, long long totalLength) {}98 progressBlock:^(long long uploaded, long long totalLength) {}
99 completionBlock:^(NSDictionary *updatedNodeInfo, NSError *magicUploadError) {99 completionBlockOnMainQueue:^(NSDictionary *updatedNodeInfo, NSError *magicUploadError) {
100 100
101 if (magicUploadError != nil)101 if (magicUploadError != nil)
102 {102 {
@@ -134,17 +134,16 @@
134 134
135 if (self.progressBlock)135 if (self.progressBlock)
136 self.progressBlock(uploaded, totalLength);136 self.progressBlock(uploaded, totalLength);
137 } completionBlock:^(NSDictionary *updatedNodeInfo, NSError *regularUploadError) {137
138 } completionBlockOnMainQueue:^(NSDictionary *updatedNodeInfo, NSError *regularUploadError) {
138 if (regularUploadError != nil)139 if (regularUploadError != nil)
139 {140 {
140 self.error = regularUploadError;141 self.error = regularUploadError;
141 }142 }
142143
143 dispatch_async(dispatch_get_main_queue(), ^{144 [self.fileInfo setUploadPercentage:1.0];
144 [self.fileInfo setUploadPercentage:1.0];145 [self.fileInfo setUploading:NO];
145 [self.fileInfo setUploading:NO];146 [self.fileInfo setUploaded:YES];
146 [self.fileInfo setUploaded:YES];
147 });
148 147
149 [self.fileNode updatePropertiesFromJSONDictionary:updatedNodeInfo];148 [self.fileNode updatePropertiesFromJSONDictionary:updatedNodeInfo];
150 [self finishExecuting];149 [self finishExecuting];
@@ -153,11 +152,9 @@
153 }152 }
154 else153 else
155 {154 {
156 dispatch_async(dispatch_get_main_queue(), ^{155 [self.fileInfo setUploadPercentage:1.0];
157 [self.fileInfo setUploadPercentage:1.0];156 [self.fileInfo setUploading:NO];
158 [self.fileInfo setUploading:NO];157 [self.fileInfo setUploaded:YES];
159 [self.fileInfo setUploaded:YES];
160 });
161 158
162 [self.fileNode updatePropertiesFromJSONDictionary:updatedNodeInfo];159 [self.fileNode updatePropertiesFromJSONDictionary:updatedNodeInfo];
163 [self finishExecuting];160 [self finishExecuting];

Subscribers

People subscribed via source and target branches