原创总结,干货,有误欢迎指正,转载请注明出处,谢谢。
1. iOS多任务用啥好?
两大利器:GCD与NSOperation
2. 为啥用这两个东西,不直接用NSThread?
1)使我们更专注于实现功能,把tasks扔到Dispatch Queue,或者Operation Queue里,让它们负责开辟回收线程,处理线程同步问题
2) 提供了解决 Race Condition, PRiority reverse 的能力。 ------- 有三个问题:共享资源访问,优先级反转,死锁。
3)使用block,方便。
4) 提供控制task执行的方法(暂停取消任务,获取任务状态,得到任务&所有任务完成的反馈); 多个task可以设定依赖关系,按顺序执行。
3. GCD分类
首先Dispatch Queue: 分为串行队列,并行队列。 也可分为系统queue,自定义queue。
1) main Queue : 串行队列,对应这UI主线程。
2) Global Queue: 并行。
3) 自定义,默认串行,指定参数并行。
4.并行队列有啥用?
好几个task同时执行,快。
5. 串行队列有啥用?
1)队列里的tasks如果需要先后顺序关系, 2)解决同步访问资源问题 Race Condition
6. GCD Group干啥的?
把任务放到队列里的同时也可以放到Group里,目的是可以知道所有任务都结束了。使用 Group_notify
7.Dispatch queue 的 sync / async 注意事项:
1)sync 阻塞当前线程,等待方法返回,这是和async的区别
2)不要在主线程(main queue)里调用sync ---卡住UI,感觉程序死掉了
3) 不要 currentQueue.sync , 这样会把currentQueue阻塞了,然后还想让它执行任务 ---- DeadLock. 当然,swift里已经不能currentQueue了。
4)queueA.sync { 这里边别调用queueA} ---又是DeadLock.
5)sync各种不能用,哪用它做啥?? ------ 多个线程访问共享资源的时候用 。。用 [private serial queue ].sync 实现get , 用[private serial queue ].async实现set。
8. 解决共享资源访问
1)把dispatchBarrier 放到并发Queue里,先于执行的仍然并行,dispatchBarrier串行, 之后的再并行。
2)private serial queue ----私有串行队列--- 苹果WWDC推荐方式,不推荐用Barrier了。
新闻热点
疑难解答