死鎖緣由:其實死鎖主要集中在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);
原文設計