首页 > 系统 > iOS > 正文

总结一下iOS的并发---之GCD

2019-11-09 14:28:19
字体:
来源:转载
供稿:网友

原创总结,干货,有误欢迎指正,转载请注明出处,谢谢。

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了。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表