1

セットアップ:

(iPhone アプリケーションで) 2 つのマネージド コンテキストをセットアップしています。ほとんどのクエリに使用するメイン コンテキストと、バックグラウンドで発生させたい長時間実行操作に使用するバックグラウンド コンテキストです。

各管理対象オブジェクト コンテキストに対して NSManagedObjectContextDidSaveNotification の通知をセットアップしました。通知に応じて、mergeChangesFromContextDidSaveNotification を呼び出して同期します。また、メイン コンテキストで状況が変化するたびに、バックグラウンド コンテキストでいくつかのジョブを実行する必要があることも要件です。これは、物事の状態が変化したためです。

コンテキストの 1 つだけに書き込む限り、これは正常に機能します。この場合、メイン コンテキストに書き込みます。ただし、バックグラウンド コンテキストで記述すると、無限ループが発生します。バックグラウンド コンテキストに保存すると、メイン コンテキストへの通知がトリガーされます。メイン コンテキストは、変更をマージし、バックグラウンド コンテキストによって取得された独自の通知を起動します。これにより、バックグラウンド コンテキストがバックグラウンド ジョブを実行するようにトリガーされ、(何かを書き込む場合) サイクルが再び開始されます。

これは間違った設定であるか、「メインコンテキストで何かが変更されるたびにバックグラウンドジョブの処理を開始する」を変更通知から切り離す方法が必要か、またはバックグラウンドコンテキストを読み取り専用にする必要があるようです。

アイデア?典型的な「2 番目のコンテキストはインポート用」のシナリオとは異なり、バックグラウンド コンテキストをメイン コンテキストに関して最新の状態に保つ必要がある/望んでいると考えているため、バックグラウンドから適切な結果が得られます。仕事。

4

2 に答える 2

1

デザインの問題のように聞こえます。おそらくそれを回避することはできますが、「永続的な」バックグラウンドコンテキストを持つことは避けることを検討する必要があります。私は通常、操作ごとにコンテキストを立ち上げ(NSOperationsが最適に機能する)、その1つのジョブが完了したらそれらを破棄することをお勧めします。これにより、メインコンテキストを更新するだけでよいため、複数のコンテキストの同期を維持する必要がなくなります。

永続的なバックグラウンドコンテキストが必要なのはなぜだと思いますか?理由がパフォーマンスである場合、それを分析しましたか?

于 2010-07-28T23:36:07.753 に答える
0

NSSet受け取ったすべてを含む for both コンテキストを作成できますNSNotifications。別のものを取得するたびに、呼び出す前にそれらと照合してくださいmergeChangesFromContextDidSaveNotification。考えてみれば、どちらのコンテキストでも最後の 1 つを保存するだけで十分なはずです…</p>

于 2010-07-28T22:12:22.920 に答える