总纲:
尽量不要自己管理线程,由系统管理更加简单高效安全。
iOS上支持并发的类型:
- GCD:可并发也可串行,queue严格先进先出,基于C,使用block执行线程任务。给你的任务选择适合的dispatch queue即可。
- Operation:可以配置任务依赖,总是并发,基于Cocoa,支持KVO通知监控执行状态。
- 线程:自己管理线程的生命周期,同步加锁有一定性能开销。
准则:
- 尽量用GCD或者Operation来代替自己管理线程,实现简单并且执行效率高。
- 使用串行dispatch queue来管理互斥资源和临界区,比使用信号量更加高效。
- 使用Operation对象时:
- 如果需要获取执行后的结果数据,需要拥有Operation对象的引用,防止执行完被销毁。
- 默认start并未捕捉异常,必须自己来捕获所有异常。
- Operation的调度是有性能开销的,尽量避免大量的小operation对象。
- 加入queue后,不要再修改Operation对象。
4. 自定义Operation对象时:
- 即使执行被取消,也要通知KVO observers,防止有执行依赖。
- 配置依赖关系时,注意不能创建循环依赖。
- 在任务中应该创建自己的autorelease pool。
5. 使用GCD:
- 不要在Block中使用父函数的大写结构体和指针内容,也不要用_block来修改外部变量。
- 避免大量任务太小的block。
- 使用queue context指针来共享block之间数据,而不是缓存。
- 如果创建大量OC对象,最好自己创建autorelease pool。
- 使用串行queue注意引用计数。
- 尽量避免在任务中获取锁(semaphore)。
- 尽量避免在任务中使用POSIX线程函数(pthread)
6. 对于实时性要求高的任务,还是需要使用线程。