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

回答

7

是,dispatch_sync将阻塞,直到任务完成。使用dispatch_async,当作业完成后,它会将一个块发回主队列以更新视图。

+0

好了,所以它会阻止,即使它被派去对全球队列主线程。我接到你了。好,谢谢。我已经编辑上面的问题来显示我实施的答案。 – 2012-01-09 06:05:00

+0

我认为dispatch_sync()文档中的关键代码可能错过了:“作为优化,dispatch_sync()在可能的情况下调用当前线程上的块。”为了达到你想要的效果,你应该有异步调度工作,然后在工作完成时,异步调度主队列上的UI更新。这是一种常见的模式。 – jkh 2012-01-10 02:13:10

相关问题