iOS总结-Runloop篇(一)

参考大神:https://blog.ibireme.com/2015/05/18/runloop/

runloop的概念

一般老说,一个线程一次只执行一个任务,执行完成之后线程退出.为了节省cpu资源,我们需要一个机制,让线程能随时处理事件并不退出.这种模型称为Event Loop.RunLoop实际就是一个对象,这个对象管理了其需要处理的事件和消息.内部就是一个循环,接受消息->等待->处理的循环中,当没有响应的时候退出循环..

OSX/iOS中,提供了两个这样的对象:NSRunLoop和CFRunLoopRef

CFRunLoopRef是在CoreFoundation框架内,纯C的API,所有API是线程安全的

NSRunLoop是基于CFRunLoopRef的OC的封装,提供面向对象的API,不是线程安全的.

ios中遇到的pthread_t,NSTread是pthread_t的封装,他们是一一对应的.pthread_main_np()/[NSTread mainThread]来获取主线程,pthread_self()/[NSTread currentThread]来获取当前线程.CFRunLoop是基于pthread来管理的.

苹果不允许直接创建RunLoop,只提供自动获取两个函数:CFRunLoopMain() 和 CFRunLoopGetCurrent()

RunLoop的5个类:

CFRunLoopRef    CFRunLoopModeRef  CFRunLoopSourceRef  CFRunLoopTimerRef  CFRunLoopObserverRef

一个RunLoop包含若干个Mode,每个Mode又包含若干个Sources/Timer/Observer,每次只能指定一个model,切换model需要退出Loop,重新进去.这样是为了让每个model的Source/Timer/Observer互不影响.

CFRunLoopSourceRef:是事件产生的地方.Source有两个版本:Source0,Source1

Source0只包含一个回调,不能主动触发事件,需要先调用CFRunLoopSourceSignal(source),将这个Source标记为待处理,然后收到调用CFRunLoopWakeUp(runLoop)来唤醒RunLoop,让它其处理这个事件.

Source1包含了一个mach_port和一个函数指针的回调,被用于通过内核和其他线程互相发送消息,能主动唤醒RunLoop的线程.

CFRunLoopTimerRef:基于时间的触发器,它和NSTimer是toll-free bridged的,包含了一个时间长度和一个函数指针回调,加入RunLoop时,RunLoop会注册对应时间点,当时间点到时,RunLoop会被唤醒执行那个回调.

CFRunLoopObserverRef : 观察者,每个Observer都包含了一个函数指针回调,当RunLoop状态发生变化时,观察者能通过回调接受这个变化.      观测时间点:   KCFRunLoopEntry  即将进入Loop

                                              kCFRunLoopBeforeTimers  即将处理 Timer

                                              kCFRunLoopBeforeSources 即将处理 Source

                                              kCFRunLoopBeforeWaiting 即将进入休眠

                                              kCFRunLoopAfterWaiting    刚从休眠中唤醒

                                              kCFRunLoopExit  即将退出Loop

Source/Timer/Observer统称为mode item,一个item可以被加入多个model中,如果一个model中一个item都没有,则RunLoop直接退出,不进入循环.

CFRunLoop的结构

CFRunLoopMode的结构

有关CFRunLoopObserver/CFRunLoopActivity/CFRunLoopTimer/CFRunLoopSources的常用方法
有关监控主线程卡顿,其实就是利用子线程CFRunLoopObserver观察者的CFRunLoopActivity的状态,来发送通知,获取到当前堆栈信息

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值