RunLoop的概念和使用

1.本质:

死循环

监听机制

事件的传递链和响应链

消息机制

2.作用:

保持程序一直运行不退出

监听所有事件(触摸、定时器、selector),有任务就处理,无任务就休眠等待事件唤醒

3.常用的mode:

NSDfaultRunLoopMode:默认模式

NSTrackingRunLoopMode:优先级高,只有触摸时才会监听该模式,同时在主线程中,会停止监听default模式,一旦停止触摸则结束监听该模式并切换为default模式

NSRunLoopCommonModes:占位模式,在Default和Tracking模式中添加事件,实现触摸时不会停止定时器事件

4.runloop与线程关系:

每一个线程都有一个runloop对象

主线程自动创建runloop对象并启动

子线程需手动创建runloop对象和启动

主线程的runloop和子线程的runloop互不影响

runloop的生命周期从第一次创建开始,到线程结束销毁

5.保持线程常驻

self.thread = []; //创建线程

NSRunLoop *runloop = [NSRunLoop currentRunLoop]; //创建当前线程控制的runloop

[runloop addport: [NSMachPort port] forMode:NSDfaultRunLoopMode]; //添加端口到的runloop

[runloop run];  //手动启动runloop

performSelector:onThread:self.thread withObject:waitUntilDone: //启动线程

6.使用场景

后台播放音乐:通过常驻线程实现

滚动scrollview和定时器事件互不影响:通过将timer添加到tracking模式下实现,如果定时器有耗时操作,则将timer添加到子线程控制的runloop中的default模式下实现。

7.唤醒runloop条件

timer、source1、手动唤醒、处于超时状态(先唤醒然后退出)

8.监听的事件源

input sources:处理异步消息。如port、customer、selector

timer sources:处理同步消息。如定时器、触摸

9.推出runloop方式

[runloop run];//一直运行,直到处理所有事件源时退出

[runloop runUntilDate:];//超时退出

[runloop runMode: beforeDate:];//会运行一次,超时或者事件源处理完毕会退出

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 基本概念 进程 进程是指在系统中正在运行的一个应用程序,而且每个进程之间是独立的,它们都运行在其专用且受保护的内存...
    小枫123阅读 4,430评论 0 1
  • 什么是RunLoop? 可以理解为字面意思:Run表示运行,Loop表示循环。结合在一起就是运行的循环的意思。哈哈...
    Nothing_xy阅读 2,166评论 0 0
  • RunLoop NSRunLoop是IOS消息机制的处理模式 主要作用 一条线程对应一个RunLoop,主线程的R...
    大冲哥阅读 1,670评论 0 0
  • 认识 Runloop Runloop 就是运行循环,如果没有 Runloop,程序一运行就会退出,有 Runloo...
    BWLi420阅读 5,518评论 0 19
  • RunLoop是iOS开发中非常底层的一个概念,我们来看看runloop的实现原理,然后结合实例讲解下runloo...
    西木柚子阅读 9,524评论 8 60