- 博客(1)
- 资源 (2)
- 收藏
- 关注
原创 通过AFN3.0实现断点下载
AFN3.0的网络请求都是通过创建一个NSURLSessionTask是完成的,而下载则是实现NSURLSessionTask的子类NSURLSessionDownloadTask。普通下载只要调用- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request ...
2018-06-04 10:33:31 249
CFRunLoop源码
Runloop的工作:如何管理事件/消息,如何让线程在没有处理消息时休眠以避免资源占用、在有消息到来时立刻被唤醒。
Osx/ios提供了两种runloop对象 :
CFRunLoopRef是在CoreFoundation框架呢,是纯C函数的API,是线程安全的
NSRunLoop是基于CFRunLoopRef的封装,不是线程安全
CFRunLoopRef的线程安全性:CFRunLoopRef不是在线程刚创建的时候创建的,而是在线程获取的时候创建的,如果不主动获取线程,一直不会有。CFRunLoopRef在创建时通过static CFSpinLock_t loopsLock锁住CFRunLoopRef对象,所以CFRunLoopRef是安全的。
一个runloop包含若干个mode。每个mode又包含若干个Source/Timer/Observer
CFRunLoopSourceRef是事件产生的地方。Source有两个版本: Source0和Source1。
Source0只包含一个回调,它不能主动出发事件,需要调用CFRunLoopSOurceSignal(source)将source标记,然后手动调用CFRunloopWakeUp()来唤醒RunLoop
Source1包含了一个mach_port和一个回调,被用于通过内核和其他线程来发送消息,这种source能主动唤醒runloop。
CFRunLoopTimerRef是基于时间的触发器,它和NSTimer是toll-free bridged的,可以混用,包含一个时间长度和一个回调。当其加入到RunLoop时,RunLoop会注册对应的时间点,当时间点到时,RunLoop会被唤醒执行回调。
CFRunLoopObserverRef是观察者,每个Observer都包含了一个回调,当RunLoop的状态发生变化时,观察者就能通过回调接受到这个变化。
2017-11-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人