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は最終的にアプリを終了します。
どんな助けでも大歓迎です。