我有一个棘手的问题:
NSOperation *operation = [[NSOperation alloc]init];
NSMutableDictionary * dictFileData = [arrData objectAtIndex:operationCounter];
[operation setCompletionBlock:^{
[self uploadFileOnAWSServer:[dictFileData valueForKey:@"MediaFileData"] MediaType:[[dictFileData valueForKey:@"MediaType"]integerValue] MediaKeyName:[dictFileData valueForKey:@"uploadKeyName"] MediaContentType:[dictFileData valueForKey:@"MediaContentType"]];
}];
[operationQueue addOperation:operation];
和方法uploadfileONAWSserve .... 我有另一个块和它的单独完成块。
通过这种方式,我必须在AWS服务器上上传多个文件,一旦完成所有文件完成,我必须在我的服务器上调用服务。 现在我需要处理这个包含成功和失败案例的多个帖子的完整场景。
任何人都可以解释如何以正确的方式处理所有成功和失败案例。
答案 0 :(得分:0)
通常,您需要为操作添加依赖项:
NSOperation *uploadOperationA = // upload operation
NSOperation *uploadOperationB = // upload operation
NSOperation *completionOperation = [NSBlockOperation blockOperationWithBlock:^{
// do stuff when other operations complete
}];
[completionOperation addDependency:uploadOperationA];
[completionOperation addDependency:uploadOperationB];
但是,您在完成块中添加了要执行的实际操作 - 并且在操作<{strong>>操作后finished
属性设置为YES
- 如果操作具有依赖关系,则当所有依赖关系都finished
设置为YES
时,它就可以执行了。因此,在您的情况下,完成操作将在您的上传实际完成之前执行
取而代之的是:
NSOperation *uploadOperationA = [NSBlockOperation blockOperationWithBlock:^{
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
[self uploadFileOnAWSServer:[dictFileData valueForKey:@"MediaFileData"] MediaType:[[dictFileData valueForKey:@"MediaType"]integerValue] MediaKeyName:[dictFileData valueForKey:@"uploadKeyName"] MediaContentType:[dictFileData valueForKey:@"MediaContentType"]];
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_release(sema);
}];
}];
dispatch_semaphore_t
是必要的,因为我认为uploadFileOnAWSServer
是异步的,因此会在完成实际上传之前立即返回。在那种情况下,在uploadFileOnAWSServer
(可能是完成块?)的某个地方你应该放
dispatch_semaphore_signal(sema);
如果该函数不是异步的,则可以完全抛弃信号量