GCD死锁及取消

GCD死锁分析及解决办法

参考

五个案例让你明白GCD死锁ios

GCD致使死锁的缘由和解决方案编程

总给
  • 死锁缘由:其实死锁主要集中在dispatch_sync, dispatch_sync建立同步线程时,要注意被建立线程所使用的队列,与当前线程所使用队列是否相同且为串行队列,相同而且为串行队列时,死锁就会产生!!!!异步

  • 解决办法:只要不在线程中调用会阻塞这个线程的方法便可。async

  • 写法替代思考: 事实上,咱们使用同步的方法编程,每每是要求保证任务之间的执行顺序是彻底肯定的。且不说GCD提供了不少强大的功能来知足这个需求,向串行队列中同步的添加任务自己就是不合理的,毕竟队列已是串行的了. 若是要实现这种相似的能够用NSOperation里的依赖建立!!!(本站另外一文章有细说)atom

  • 为什么程序要设计这个建立同步线程的操做?不使用异步线程代替或是使用NSOperation的依赖关系建立?(暂时未遇到这个使用场景)spa

// 队列类型
// 全局队列,也是一个并行队列
dispatch_get_global_queue 
// 主队列,在主线程中运行,由于主线程只有一个,因此这是一个串行队列
dispatch_get_main_queue
同步与异步线程的建立
dispatch_sync(..., ^(block)) // 同步线程
dispatch_async(..., ^(block)) // 异步线程

GCD的取消

  • 使用场景,列表滚动时,有部分处理须要等待列表结束才开始,例如视频连续页。.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);

原文设计

相关文章
相关标签/搜索