处理块,完成处理程序,dispatch_async与dispatch_sync [英] Dealing with Blocks, completion handlers, dispatch_async vs dispatch_sync
问题描述
我正在线程中执行在线数据获取,并且我想在执行块后立即执行某项操作.
I'm executing an online fetch of data in a thread and I want to do something immediately after the block is executed.
这是我的代码:
- (IBAction)refresh:(UIBarButtonItem *)sender {
NSLog(@"checking");
[self editToolbar];
dispatch_queue_t fetchQ = dispatch_queue_create("Refreshing", NULL);
dispatch_async(fetchQ, ^{
[self setupFetchedResultsController];
[self fetchImonggoItemsDataIntoDocument: self.itemDatabase];
});
dispatch_release(fetchQ);
NSLog(@"done checking");
//do something here
}
事情是dispatch_async立即返回,并且即使在该块执行完毕之前,也会立即打印完成检查".我该如何解决?
The thing is dispatch_async returns immediately and "done checking" prints immediately even before the block is done executing. How do I solve this?
推荐答案
我认为这是一个体系结构问题.任务类似于:
I think it's an architectural issue. The tasks are something like:
- 编辑工具栏
- fetchImonggoItemsDataIntoDocument
- 做其他事情
如果必须按顺序正确完成这些操作,那么我对块或队列的使用不太了解.只需一个接一个地运行这些语句,您就会被设置.
If these must be done exactly in order then I don't quite understand the use of blocks or queues; just run the statements after each other and you'll be set.
否则,备选方案1是使用dispatch_sync
而不是dispatch_async
.再说一次,我不太确定使用队列的好处是什么,但是确实有.
Otherwise, alternative #1 would be to use dispatch_sync
rather than dispatch_async
. Again, I'm not quite sure what the benefit of using a queue would be but there it is.
替代方法2是使用该块中的回调.像这样:
Alternative #2 would be to use a callback from the block. Something like:
- (IBAction)refresh:(UIBarButtonItem *)sender {
NSLog(@"checking");
[self editToolbar];
dispatch_queue_t fetchQ = dispatch_queue_create("Refreshing", NULL);
dispatch_async(fetchQ, ^{
[self setupFetchedResultsController];
[self fetchImonggoItemsDataIntoDocument: self.itemDatabase];
[self doneChecking]; // <-- NOTE! call the callback
});
dispatch_release(fetchQ);
}
// NOTE! refresh: has been split up into two methods
- (void)doneChecking:
NSLog(@"done checking");
//do something here
}
这篇关于处理块,完成处理程序,dispatch_async与dispatch_sync的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!