1

NSOperationQueueセットしていNSOperationQueueDefaultMaxConcurrentOperationCountます。それはオブジェクトで満たされていNSOperationます(これまでのところ奇妙なことは何もありません). をサブクラス化しNSOperationて、いくつかのバックグラウンド タスクを実行しました。

  1. インターネットからデータをダウンロードします。
  2. データを解析して、読み取れるようにします。
  3. NSManagedObject を作成します。

    [NSEntityDescription insertNewObjectForEntityForName:@"Channel" inManagedObjectContext:context];

  4. コンテキストで保存します。

    [managedObjectContext 保存:&エラー]

UI がブロックされないように、これがすべてバックグラウンドで行われるのが好きです。コアデータとの並行性に関するこの記事を読み、理解した限り. NSManagedObjectContext最善の方法は、すべての に新しい を作成することですNSOperationが、同じ永続ストア コーディネーターを共有します。

これは簡単に実行できますが、ドキュメントに記載されているコンテキストの保存に関しては、そうするとエラーが発生しやすくなります。だから私の質問は次のとおりです。

  1. NSOperationQueue で別の操作を実行している場合、管理対象オブジェクトのコンテキストを保存する際に、それらの操作が互いに干渉する可能性はありますか? それとも、保存が完了するまで次の操作を実行するのを待ちますか?

  2. コンテキストを NSOperation に安全に保存できますか? それとも本当に悪い習慣ですか?

私は今本当に立ち往生しているので、誰かがこの問題に光を当ててくれることを願っています.

4

1 に答える 1

1

あなたがする必要があるのは次のとおりです。

  1. 各 NSOperation の管理オブジェクト コンテキストを作成します。メイン メソッドでこの新しいコンテキストを作成します。これは、正しいスレッドで実行されているためです。
  2. コンテキスト永続ストア コーディネーターを割り当てます。
  3. NSManagedObjectContextDidSaveNotification を受け取るオブザーバーを作成します。これは、NSOperation のコンテキストで変更が行われた時点でメイン コンテキストが知る唯一の方法です。マージ コンテキストが存在するスレッド/ブロックでマージ呼び出しが行われていることを確認します。メイン スレッドのコンテキストとマージする場合は、NSOperation のコンテキストからの通知を使用して、メイン スレッドで mergeChangesFromContextDidSaveNotification: メソッドを呼び出します。

また、これらすべての操作を同時に実行する必要があるかどうかを自問してください。ドキュメントごと:

操作のデフォルトの最大数は、現在のシステム条件に基づいて NSOperationQueue オブジェクトによって動的に決定されます。

同時に動作する NSOperation の数を制御することはできません。これが望ましくない場合は、シリアル NSOperationQueue (maxConcurrentOperation=1) を使用する方が良いかもしれません。これは、データベースをロックして保存を行うという事実と、ネットワークを使用しているためです。同様に行われました。

上記の予防措置を講じれば、NSOperation のメイン メソッド内に安全に保存できます。

于 2012-08-13T14:09:07.390 に答える