Ala*_*din 3 asynchronous block objective-c grand-central-dispatch ios
我有一个块的异步功能:
[self performAsyncTaskCompletion:(void(^) () )
{
//Do Something
}
];
Run Code Online (Sandbox Code Playgroud)
我需要多次调用此函数,但需要以同步方式调用.我试图使用GCD队列:
dispatch_queue_t queue = dispatch_queue_create("com.MyApp.task", NULL);
for (int i = 0; i < array.count; i++)
{
dispatch_sync(queue, ^{
[self performAsyncTaskCompletion:(void(^) () )
{
//Do Something
}
];
});
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用,因为dispatch_sync只等待块的结束.如何让它等待其块中的异步函数结束?
如果要在完成一系列异步任务后启动某个进程,可以使用调度组,但是希望允许这些任务相互之间并发运行(特别是对于网络请求,可以提供更好的性能)而不是顺序运行它们:
dispatch_group_t group = dispatch_group_create();
for (int i = 0; i < array.count; i++) {
dispatch_group_enter(group);
[self performAsyncTaskCompletion: ^{
//Do Something
dispatch_group_leave(group);
}];
}
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// do this when its all done
});
Run Code Online (Sandbox Code Playgroud)
就个人而言,我甚至可能倾向于performAsyncTaskCompletion使用异步NSOperation子类模式执行更激进的重构.然后,你可以添加这些到NSOperationQueue与maxConcurrentOperationCount指定的,能够得到相同的并发性,同时控制并发度.但希望上面说明了这个想法:同时运行任务,但是在没有阻塞主线程的情况下检测这些任务的完成.
| 归档时间: |
|
| 查看次数: |
2491 次 |
| 最近记录: |