GCD死锁及取消

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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);


原文

转载于:https://my.oschina.net/u/3729367/blog/1583689

你可能感兴趣的:(python)