sync
同じシリアルキュー上の別のディスパッチからディスパッチを呼び出すとデッドロックが発生することは知っていsync
ますが、これが私が聞いたGCDデッドロックの唯一の「既知の」原因です。
sync
グローバル同時キューを使用しているので、リクエストがデッドロックにつながることはないと思います。私はこのコードを持っています、それは使用していASIHTTPRequest
ます:
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
[self.networkQueue cancelAllOperations];
self.networkQueue=nil;
self.networkQueue=[ASINetworkQueue queue];
});
cancelAllOperations
で数千の操作を行う場合、かなり長い時間がかかる可能性があるため、この部分を高速化することを目的としていましたnetworkQueue
。
しかし、このコードを呼び出すと、デッドロックが発生します。このブロックをGCDから取り出してメインスレッドで実行すると、実行中に遅延がcancelAllOperations
発生しますが、デッドロックなしで完了します。ただし、このディスパッチ内では、アプリがフリーズし、iOSは最終的にアプリを終了します。
どんな助けでも大歓迎です。