GCD

作者: 上尉H借个火 | 来源:发表于2018-03-20 09:40 被阅读0次

    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 指令可以创建一个信号量,并进入临界区,临界区在任何时刻都只能 被一个线程执行。

    相关文章

      网友评论

          本文标题:GCD

          本文链接:https://www.haomeiwen.com/subject/muppqftx.html