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:];//会运行一次,超时或者事件源处理完毕会退出
网友评论