私のアプリには、View Controllerが依存して渡すコンテキストNSPrivateQueueConcurrencyType
の親として機能する「マスター」コンテキストがあります。NSMainQueueConcurrencyType
非同期保存を利用するためにこれを行いたかったのです (このアプリは iCloud と Core Data を使用し、保存はユビキタス ログをエクスポートする多くの作業を行います)。セットアップは、この記事の最後に記載されている Zarra のアプローチに似ています。
アプリ内の保存は通常次のようになります。
[context save:nil];
[context.parentContext performBlock:^{
[context.parentContext save:nil];
}];
これは小さな編集/更新にはうまくいくようですが、多くのオブジェクトを削除するとどうなるかわかりません (たとえば、何百ものタスク オブジェクトが関連するプロジェクトを削除するなど)。
その状況では、保存は非同期ですが、メイン スレッドがセマフォ待機状態になり (デバッガーを一時停止したときに見られるように)、バックグラウンドのプライベート コンテキストが終了するまで効果的にブロックされているように見えます (UI でスクロールできません)。保存。
実際、この非同期保存パターンにもかかわらず、1 つのオブジェクトをスワイプして削除すると、顕著な遅延が発生することに気付きました。そのため、アプリ内のすべての削除が遅いようです。
あるいは、新しいNSPrivateQueueConcurrencyType
コンテキストを割り当て、その永続ストア コーディネーターを AppDelegate のメイン PSC に設定し、削除と保存を実行すると、多くの作業が行われますが、UI がブロックされることはありません (ただし、心配する必要があります)コンテキストの調整、メイン コンテキストでの再取得について)。
私が間違っていた可能性のあるアイデアはありますか、またはこの動作も見ましたか?