私はバックグラウンド操作を多用していますが、これがデッドロックを引き起こすかどうか興味がありました. 私は、performblockandwait を使用していくつかの異なるスレッドから (おそらく同時に) 参照されるプライベート キューを使用するように Core Data Managed Object Context を設定しています。特定の条件下では、別のバックグラウンド タスクの完了によってバックグラウンド タスクが開始される場合があります。
メインスレッドまたはバックグラウンドタスクでのユーザー入力から発生する可能性がある特定の条件が満たされたときにバックグラウンドタスクが開始されるため、次のような可能性があります。
- (void)task1
{
__weak MyClass *weakself = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0),^{
....
....
[context performBlockAndWait:^{
BOOL condition = [weakself performDbCleanup];
if (condition)
{
[weakself task2];
}
}];
});
}
- (void)task2
{
__weak MyClass *weakself = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0),^{
....
....
[context performBlockAndWait:^{
[weakself performDbCleanup2];
}];
});
}
このようにする必要がある理由を正確に説明するのは難しいですが、これは起こっていることの非常に単純化されたバージョンであるため、両方のインスタンスで performBlockAndWait が必要です。DB コンテキストへのアクセスをブロックしたくない、またメイン スレッドをブロックしてはならない performBlockAndWait 呼び出しの前後に長い処理が発生します。