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

原文設計

相關文章
相關標籤/搜索