GCD队列优先级和队列组
GCD队列的服务质量与优先级
NSQualityOfServiceUserInteractive
与用户交互的任务,这些任务通常跟 UI 级别的刷新相关,比如动画,这些任务需要在一瞬间完成;NSQualityOfServiceUserInitiated
由用户发起的并且需要立即得到结果的任务,比如滑动scroll view
时去加载数据用于后续cell
的显示,这些任务通常跟后续的用户交互相关,在几秒或者更短的时间内完成;NSQualityOfServiceUtility
一些可能需要花点时间的任务,这些任务不需要马上返回结果,比如下载的任务,这些任务可能花费几秒或者几分钟的时间;NSQualityOfServiceBackground
这些任务对用户不可见,比如后台进行备份的操作,这些任务可能需要较长的时间,几分钟甚至几个小时;NSQualityOfServiceDefault
优先级介于user-initiated
和utility
,当没有 QoS 信息时默认使用,开发者不应该使用这个值来设置自己的任务。
服务质量枚举类型
1 | QOS_CLASS_USER_INTERACTIVE |
队列的优先级与服务质量的对应关系:
给队列设置QoS
dispatch_queue_attr_make_with_qos_class
dispatch_set_target_queue
GCD队列任务间依赖关系
dispatch_set_target_queue
除了能用来设置队列的 QoS 之外,还能够创建队列的层次体系。当我们想让不同队列中的任务同步的执行时,我们可以创建一个串行队列,然后将这些队列的 target 指向新创建的队列即可,比如:
1 | dispatch_queue_t targetQueue = dispatch_queue_create("target_queue", DISPATCH_QUEUE_SERIAL); |
注意点: 避免相互依赖,如将队列 A 的目标队列设置为队列 B,并将队列 B 的目标队列设置为队列 A。
Dispatch Group队列组
GCD 队列组,又称“调度组”,实现所有任务执行完成后有一个统一的回调。
例如:异步下载歌曲,等所有歌曲都下载完毕以后,转到主线程提示用户
1 | dispatch_group_t group = dispatch_group_create(); |
队列组的原理
真正实现统一回调的操作:
1 | void dispatch_group_enter(dispatch_group_t group); |
1 | dispatch_group_async(group, queue, ^{ |
1 | // 1.创建队列组 |
RunLoop之NSTimer
NSTimer 的创建
NSTimer
的创建通常有两种方式,一种是以 scheduledTimerWithTimeInterval
为开头的类方法 。这些方法在创建了 NSTimer
之后会将这个 NSTimer
以 NSDefaultRunLoopMode
模式放入当前线程的 RunLoop
。
1 | + ( NSTimer *) scheduledTimerWithTimeInterval:invocation:repeats: |
另一种是以 timerWithTimeInterval 为开头的类方法。这些方法创建的 NSTimer 并不能马上使用,还需要调用 RunLoop 的 addTimer:forMode: 方法将 NSTimer 放入 RunLoop,这样 NSTimer 才能正常工作。
1 | + ( NSTimer *) timerWithTimeInterval:invocation:repeats: |
Timers work in conjunction with run loops. Run loops maintain strong references to their timers, so you don’t have to maintain your own strong reference to a timer after you have added it to a run loop.
从 NSTimer
的官方文档可以得知,RunLoop
对加入其中的 NSTimer
会添加一个强引用。
RunLoop之事件循环机制、线程
RunLoop之简介、数据结构
super的本质
objc_supre与objc_msgSendSuper
objc_super 和 objc_super2
它们的区别在于第二个成员:
objc_super
:super_class //receiverClass的父类objc_super2
: current_class//receiverClass(消息接收者的class对象)
1 | // message.h(objc4) |