2019独角兽企业重金招聘Python工程师标准>>>
GCD死锁分析及解决办法
参考
五个案例让你明白GCD死锁
GCD导致死锁的原因和解决方案
总给
-
死锁原因:其实死锁主要集中在dispatch_sync, dispatch_sync创建同步线程时,要注意被创建线程所使用的队列,与当前线程所使用队列是否相同且为串行队列,相同并且为串行队列时,死锁就会产生!!!!
-
解决办法:只要不在线程中调用会阻塞这个线程的方法即可。
-
写法替代思考: 事实上,我们使用同步的方法编程,往往是要求保证任务之间的执行顺序是完全确定的。且不说GCD提供了很多强大的功能来满足这个需求,向串行队列中同步的添加任务本身就是不合理的,毕竟队列已经是串行的了. 如果要实现这种类似的可以用NSOperation里的依赖创建!!!(本站另一文章有细说)
-
为何程序要设计这个创建同步线程的操作?不使用异步线程代替或是使用NSOperation的依赖关系创建?(暂时未遇到这个使用场景)
// 队列类型
// 全局队列,也是一个并行队列
dispatch_get_global_queue
// 主队列,在主线程中运行,因为主线程只有一个,所以这是一个串行队列
dispatch_get_main_queue
同步与异步线程的创建
dispatch_sync(..., ^(block)) // 同步线程
dispatch_async(..., ^(block)) // 异步线程
GCD的取消
-
使用场景,列表滚动时,有部分处理需要等待列表结束才开始,例如视频连续页。
-
参考代码
//订阅gcd变量
@property (nonatomic, strong) dispatch_block_t dispatch_seekto_block;
//取消GCD
if (self.dispatch_seekto_block) {
dispatch_block_cancel(self.dispatch_seekto_block);
self.dispatch_seekto_block = NULL;
}
//真实处理
self.dispatch_seekto_block = dispatch_block_create(0, ^{
@strongify(self)
//do some ting
});
//执行延迟
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(kSeekDelayTime * NSEC_PER_SEC)), dispatch_get_main_queue(), self.dispatch_seekto_block);
原文