4
// Method called when a button is clicked
- (void)handleClickEvent {
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self backgroundProcessing];
});
// Some code to update the UI of the view
....
[self updateUI];
....
}
1)handleClickEvent称为主线程上。是否(dispatch_get_global_queue())在主线程应用程序的原因“挂起”呼叫dispatch_sync?当按下上视图的按钮
2)I使用dispatch_sync(),因为不能进行下面的代码来更新视图的UI直到backgroundProcessing方法的变量进行计算。
3)我为了得到backgroundProcessing关闭主线程中使用dispatch_get_global_queue。 (遵循以下规则:通常将背景处理置于主线程之外,并且通常将影响UI的代码放在主线程上)。
我的问题是:是否backgroundProcessing方法“挂”主线程,直到它完成,因为我使用dispatch_sync?
编辑: 基于答案下面我已经实现这个解决方案:从这个链接
- (void)handleClickEvent {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self backgroundProcessing];
dispatch_async(dispatch_get_main_queue(), ^{
[self updateUI];
});
});
}
解决方案:Completion Callbaks
好了,所以它会阻止,即使它被派去对全球队列主线程。我接到你了。好,谢谢。我已经编辑上面的问题来显示我实施的答案。 – 2012-01-09 06:05:00
我认为dispatch_sync()文档中的关键代码可能错过了:“作为优化,dispatch_sync()在可能的情况下调用当前线程上的块。”为了达到你想要的效果,你应该有异步调度工作,然后在工作完成时,异步调度主队列上的UI更新。这是一种常见的模式。 – jkh 2012-01-10 02:13:10