http://www.chuliangliang.com/2017/03/27/iOS-GCD-Grand-Central-Dispatch-1/
这篇文章GCD讲解相当详细。
http://www.cocoachina.com/ios/20161031/17887.html
这篇文章有个别地方有歧义,但仍可以作为参考
GCD
♦ 抽象程度最高。
♦ 两种队列开箱即用:main 和 global。
♦ 可以创建更多的队列(使用 dispatch_queue_create)。
♦ 可以请求独占访问(使用 dispatch_barrier_sync 和 dispatch_barrier_async)。
♦ 基于线程管理。
♦ 硬性限制创建 64 个线程。
NSOperationQueue
♦ 无默认队列。
♦ 应用管理自己创建的队列。
♦ 队列是优先级队列。
♦ 操作可以有不同的优先级(使用 queuePriority 属性)。
♦ 使用 cancel 消息可以取消操作。注意,cancel 仅仅是个标记。如果操作已经开始 执行,则可能会继续执行下去。
♦ 可以等待某个操作执行完毕(使用 waitUntilFinished 消息)。
NSThread
♦ 低级别构造,最大化控制。
♦ 应用创建并管理线程。
♦ 应用创建并管理线程池。
♦ 应用启动线程。
♦ 线程可以拥有优先级,操作系统会根据优先级调度它们的执行。
♦ 无直接 API 用于等待线程完成。需要使用互斥量(如 NSLock)和自定义代码。
原子属性
如果一个属性是 atomic,则修改和读取肯定都是原子的。
这一点很重要,因为这样可以阻止两个线程同时更新一个值,反之则有可能导致错误的状态。正在修改属性的线程必须处理完毕后,其他线程才能开始处理。
例 4-2 atomic 和 nonatomic 属性
@property (atomic) NSString *firstName; 原子属性
@property (nonatomic) NSString *department; 非原子属性
因为原子属性存在开销,所以过度使用它们并不明智。
例如,如果能够保证某个属性在任
何时刻都不会被多个线程访问,那最好还是将其标记为 nonatomic。
使用IBOutlet时就是一个很好的例子。
@property (nonatomic, readwrite, strong) IBOutlet UILabel *nameLabel 要 比 @property (atomic, readwrite, strong) IBOutlet UILabel *nameLabel更好,因为UIKit只允许在主线程中操纵UI元素。由于只会在指定的 线程内进行访问,除了带来额外开销,将属性设置为 atomic 不会带来任何价值。
使用 @synchronized 指令可以创建一个信号量,并进入临界区,临界区在任何时刻都只能 被一个线程执行。
网友评论