Objective-C:主线程及其runloop中的代码如何交互?

时间:2014-05-06 02:47:38

标签: ios objective-c multithreading nsrunloop

主线程及其runloop中的代码如何交互?例如,主线程中的所有代码是否必须运行,直到它在进入runloop之前处于空闲状态?或者runloop在主线程中执行代码的过程中检查其源代码? runloop源是否有可能阻止主线程代码执行(因为它在同一个线程上运行)?

我试图理解主要线程代码如何适应大型方案中的runloop图片(反之亦然)。

这是一个runloop与我们的代码一起的样子:

  

主线程:

     
      
  1. runloop以特定间隔运行
  2.   
  3. runloop已完成运行,我们的代码已运行
  4.   
  5. 我们的代码已经运行完毕,请转到(1)(如果我们的代码运行得太久以至于runloop无法运行会怎么样?)
  6.   

2 个答案:

答案 0 :(得分:8)

你问:

  

主线程及其runloop中的代码如何交互?

主runloop只是在主线程上执行的循环。

  

如果我们的代码运行得太长以至于runloop无法运行会怎么样?

如果你阻塞主线程(即你同步做一些非常慢的事情)那么调用你的代码并等待你返回的runloop将没有机会继续循环,因此一切都取决于(计时器,来源,用户界面等)似乎会冻结。

这就是为什么,如果你有任何需要花费超过几毫秒的任务,你应该将它发送到一些后台队列,并将它从主线程中取出,因此主线程上的代码可以立即返回运行循环并确保主线程未被阻止。这将确保主runloop可以继续运行并产生响应的UI。

就你描述runloop如何工作的三个方面而言,我可能会有不同的描述。这不是runloop“结束”然后你的代码运行。实际上,runloop是循环的,处理各种系统事件(例如UI,定时器等),并且在处理它们的过程中,它可能最终调用你的代码(在这种情况下整个主线程,包括runloop) ,阻止继续进行,直到您的代码返回到runloop)。

答案 1 :(得分:1)

runloop从多个源接收事件并处理这些事件。因此,将代码发送到主线程和/或按下按钮会将事件添加到主runloop事件队列中,并在runloop再次检查其源时处理该事件。它不会在执行当前事件的过程中暂停/锁定。

编辑:看到你的编辑,请允许我澄清一下:runloop与主线程一起工作。项目模板将runloop添加到我们的代码中,runloop与脚本一起运行代码。所以“runloop已经完成运行,我们的代码运行”是不正确的,它更像是“runloop接收来自其中一个来源的事件,告诉它在这个特定部分运行我们的代码”。