NSOperation里面的setCompletionBlock是另一个块处理

时间:2018-01-11 10:27:46

标签: ios file-upload block nsoperationqueue nsoperation

我有一个棘手的问题:

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服务器上上传多个文件,一旦完成所有文件完成,我必须在我的服务器上调用服务。 现在我需要处理这个包含成功和失败案例的多个帖子的完整场景。

任何人都可以解释如何以正确的方式处理所有成功和失败案例。

1 个答案:

答案 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);

如果该函数不是异步的,则可以完全抛弃信号量