oc 的runLoop

        我们一般程序就是执行一个线程,是一条直线.有起点终点.而runloop就是一直在线程上面画圆圈,一直在跑圈,除非切断否则一直在运行。网上说的比喻很好,直线就像昙花一现一样,圆就像OS,一直运行直到你关机为止。
 
iOS中的Run loop

1,每个线程都对应一个Run loop;

2,只有主线程的Run loop是默认在运行中的;

3,用户启动的线程,需要指定让其运行起来;如果没有运行起来,那么在该线程中nstimer是运行永远运行不起来的。

4,线程了可以通过以下方式挂载事件源:(1)创建nstimer,挂载timer事件源;(2)关联port:这个还没深入了解;(3)performselector:挂载需要发送的消息

5,可见主线程的Run loop会挂载其他系统事件源:比方按键事件,触摸屏事件;刷新屏幕也是主线程的任务。

 

Run loop的运行模式

讨论这个话题之前,我们有必要先讨论一个嵌入式系统是的性能问题:在列表滚动时,会导致频繁的屏幕绘制的需要,如果这时还需要不断检查定时任务,网络包,按键事件的话,就会导致屏幕的卡顿。幸运的是iOS给我们考虑到了这一点,下面隆重介绍Run Loop的4种模式:Default,Connection,Modal,Event tracking;第五种模式:Common modes,其实是前面几种模式的复合。其中,Event Tracking工作模式,就可以在屏幕绘制时,忽略其他事件源。可见运行模式的合理设置,可以提高应用的体验。

 

什么时候需要使用Runloop?(这节内容来自苹果的官方文档)

只有在创建新的线程时,才有可能直接用到run loop;对于主线程,配置和启动它的run loop是启动应用时非常关键的步骤,而且在启动应用时就自动启动了主线程的run loop。

对于用户创建的线程,你只需要在何时的情况下启动和配置run loop。实际上,你不需要每创建一个线程就启动它的run loop。比方,如果你只是想在用线程完成一个特别耗时的操作或计算的话,压根就不需要启动它的run loop(实际上也没有什么多少触发源需要巡查)。只要在你和线程有频繁往来的情况,才会启动run loop,例如:

使用端口或自定义的触发源和其他线程进行交流;

在线程中使用定时器;

使用类似performSelector这样的方法;

周期性的执行一些工作。

需要对run loop运行模式进行合理设置,使之有符合更好的体验。

 

一些隐性使用Run loop的操作:

1,nstimer

2,performSelector

 

简书上另一篇关于run loop原理有更详细解释的文章 :我的总结可以作为这篇文章的入门;

转载于:https://my.oschina.net/u/2381794/blog/739358

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值