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();
}
});
}
所以假设我有以下代码
-(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();
}
});
}