For loop with ASync 然后等待它完成(Obj-C)

For loop with ASync and then wait for it to complete (Obj-C)

所以假设我有以下代码

-(void)doSomething{
   [self expensiveMethod];
   [self otherMethod]; //Depends on above method to have finished
}

-(void)expensiveMethod{
 for(int i = 0; i<[someArray count]; i++{
     [self costlyOperation:someArray[i]];
  }
}

理想情况下,我希望 [self costlyOperation] 分离出其他线程,以便每个线程都尽可能并行地完成(当然我知道这不太可能)。在每个数组对象上完成 [self costlyOperation] 后,我希望它成为 return 以便 [self otherMethod 可以利用处理。

您可以使用默认队列 运行 在后台使用调度异步任务。

编辑

您可以将异步任务分组以进行并行异步执行。您可能需要根据您的要求稍微调整一下。

-(void)doSomething{
    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
        //Background Thread
        [self expensiveMethod:^{
            dispatch_async(dispatch_get_main_queue(), ^(void){
                //Run UI Updates
                [self otherMethod]; //Depends on above method to have finished
            });
        }];
    });
}

-(void)expensiveMethod:(void (^)(void))callbackBlock {

    dispatch_group_t group = dispatch_group_create();

    for(int i = 0; i<[someArray count]; i++) {
        __block int index = i;
        dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ {
            [self costlyOperation:someArray[index]];
        });
    }

    dispatch_group_notify(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ {
        if (callbackBlock) {
            callbackBlock();
        }
    });
}