Runloop2_模式和监听事件

Runloop 官方文档
Runloop和定时器的关系

上篇文章说过,Runloop监听所有的事件中包括 时钟

NSTimer定时器要想能运行起来,,不管你是哪种方式创建定时的器,必须要将定时器添加到当前的Runloop中,有些创建的定时器默认添加到了当前的Runloop中,有些创建方法需要程序员手动添加方可运行

  • 定时器最好放在子线程里去操作,因为就算你用NSRunLoopCommonModes模式,如果定时器的执行的任务里有耗时操作,它会影响ui的处理,在子线程里用NSDefaultRunLoopMode模式即可,因为子线程不会影响主线程

详解可见之前写过的定时器文章 定时器和Runloop

常用的方法
runloop和线程有关
[NSRunLoop currentRunLoop]:获取当前线程的runloop
[NSRunLoop mainRunLoop]:获取主线程的runloop
     
[[NSRunLoop currentRunLoop] run]; 本质是个死循环
子线程中的runloop需要手动开启,在子线程中这句代码之后的执行是不会执行的,因为它是死循环

UIKit框架是否 线程安全:大部分不是安全的,如果出现了多条线程访问,就会出现资源抢夺,所以就出现一个约定,用主线程去访问ui,ui所有的操作都在主线程,如果在子线程对ui进行操作,可能会出现乱七八糟的问题
而且uikit用nonatomic 效率也高
     
所谓的常驻线程:就是在自线程里[[NSRunLoop currentRunLoop] run];
模式
  • NSDefaultRunLoopMode:默认模式
  • UITrackingRunLoopMode:简单的理解为UI模式
  • NSRunLoopCommonModes:占位符,并不是真正的runloop模式,它只是按位运算为NSDefaultRunLoopMode|UITrackingRunLoopMode
runloop的source
image.png

source是指一切事件的来源,timer也是一个source
source:事件源(输入源),按照函数调用栈分为两种事件源:source0,source1
source0:非系统内核事件
source1:系统内核事件

函数调用栈:指的是函数掉用的顺序

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容