【问题标题】:NSOperation inside setCompletionBlock another block handlingNSOperation 里面的 setCompletionBlock 另一个块处理
【发布时间】:2018-01-11 10:27:46
【问题描述】:

我有一个小问题:

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

谁能解释我如何正确处理所有成功和失败的案例。

【问题讨论】:

    标签: ios file-upload block nsoperationqueue nsoperation


    【解决方案1】:

    通常,您会在操作中添加依赖项:

    NSOperation *uploadOperationA = // upload operation
    NSOperation *uploadOperationB = // upload operation
    
    NSOperation *completionOperation = [NSBlockOperation blockOperationWithBlock:^{
            // do stuff when other operations complete
        }];
    
    [completionOperation addDependency:uploadOperationA];
    [completionOperation addDependency:uploadOperationB];
    

    但是,您在完成块中添加了您想要执行的实际操作 - 并且它在操作的 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);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 2019-07-23
      • 2012-11-23
      • 1970-01-01
      相关资源
      最近更新 更多