死锁缘由:其实死锁主要集中在dispatch_sync, dispatch_sync建立同步线程时,要注意被建立线程所使用的队列,与当前线程所使用队列是否相同且为串行队列,相同而且为串行队列时,死锁就会产生!!!!异步
解决办法:只要不在线程中调用会阻塞这个线程的方法便可。async
写法替代思考: 事实上,咱们使用同步的方法编程,每每是要求保证任务之间的执行顺序是彻底肯定的。且不说GCD提供了不少强大的功能来知足这个需求,向串行队列中同步的添加任务自己就是不合理的,毕竟队列已是串行的了. 若是要实现这种相似的能够用NSOperation里的依赖建立!!!(本站另外一文章有细说)atom
为什么程序要设计这个建立同步线程的操做?不使用异步线程代替或是使用NSOperation的依赖关系建立?(暂时未遇到这个使用场景)spa
// 队列类型 // 全局队列,也是一个并行队列 dispatch_get_global_queue // 主队列,在主线程中运行,由于主线程只有一个,因此这是一个串行队列 dispatch_get_main_queue
同步与异步线程的建立 dispatch_sync(..., ^(block)) // 同步线程 dispatch_async(..., ^(block)) // 异步线程
使用场景,列表滚动时,有部分处理须要等待列表结束才开始,例如视频连续页。.net
参考代码线程
//订阅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);
原文设计