我正在线程中执行在线数据获取,并且我想在执行块后立即执行某些操作。
这是我的代码:
- (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 立即返回,并且甚至在块执行完毕之前就立即打印“完成检查”。我该如何解决这个问题?
我认为这是一个架构问题。任务类似于:
- 编辑工具栏
- fetchImonggoItemsDataIntoDocument
- 做点别的事
如果这些必须完全按顺序完成,那么我不太理解块或队列的使用;只需依次运行这些语句即可。
否则,替代方法 #1 是使用dispatch_sync
而不是dispatch_async
。同样,我不太确定使用队列有什么好处,但它就是这样。
替代方案#2 是使用块中的回调。就像是:
- (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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)