4

私はコア データを使用するアプリに取り組んでおり、これがスレッド セーフではないことを認識していますが、これを正しく管理する方法を理解するのに苦労しています。私がこれまでに持っているものを説明しましょう...

管理対象オブジェクトを開始し、他のすべてのクラスで使用できるシングルトンを作成しました。すべてのクラスが同じ管理対象オブジェクト アドレスを受け取るため、これは正しく機能しているようです。

次に、この順序で実行される2つのクラスがあります...

  1. データの読み込み。これはレコード数を取得し、ゼロの場合はコア データベースをロードします。
  2. 手順 1 で保存されたデータを表示する Tableview。

私の問題は、ステップ 1. が常にゼロのレコードを返し、ステップ 2. が機能しており、正しいレコード数を返すことです。

1.で問題をテストしたところ、実行中のスレッドが原因であり、管理対象オブジェクトが作成されたのと同じスレッドでリクエストを送信すると、完全に機能します。

では、なぜクラス 1 にあるのでしょうか。リクエストが正しいスレッド上にあり、クラス 2 にあることを確認する必要があります。うまくいくか、それとも運が良かっただけなのか。スレッドとコア データへの推奨され、文書化されたアプローチはありますか?

ありがとう

4

1 に答える 1

11

Core Data での同時実行の黄金律は、次のとおりです。各 NSManagedObjectContext は、1 つのスレッド (それが作成されたスレッド) からのみアクセスする必要があります。また、マネージド オブジェクトは、フェッチした MOC でのみ使用できます。他の MOC に渡すことはできません。

ただし、各 MOC は使用時に PSC をロックするため、スレッド間で永続ストア コーディネーターを共有できます。したがって、一般的なセットアップでは、複数の MOC に対して 1 つの PSC を使用するだけです。

詳細はこちら:

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/CoreData/Articles/cdConcurrency.html

異なるスレッドを使用しているときにケース 2. が機能しているように見える場合、それは運次第であり、正しいことではないと思います。運に頼らず、上で述べたルールに従えば、すべてうまくいきます。

追加の関連資料:

CoreData はスレッドセーフではありません。

http://www.cocoanetics.com/2012/07/multi-context-coredata/

http://www.cimgf.com/2011/05/04/core-data-and-threads-without-the-headache/

http://digitalflapjack.com/blog/2010/jun/11/parallelcoredata/

http://www.duckrowing.com/2010/03/11/using-core-data-on-multiple-threads/

原則として、 API やドキュメントで「X を実行しないでください」と書かれている場合でも、X を実行すると毎回失敗したり問題が発生したりするという意味ではありません。いつかあなたを悩ませます。物事を偶然に任せず、許可されていること (API ドキュメントなど) を見つけて実行してください。

于 2013-02-02T13:09:38.090 に答える