2017-12-29 10 views
0

私は、複数の管理対象オブジェクトコンテキストで動作する方法を学習し、ドリルの真っ只中NSManagedObjectインスタンスを決してあるスレッドから別のスレッドに渡すべきではないのはなぜですか?

let childContext = 
NSManagedObjectContext(
concurrencyType: .mainQueueConcurrencyType) 
childContext.parent = coreDataStack.mainContext 

let childEntry = 
childContext.object(with: surfJournalEntry.objectID) 
as? JournalEntry 

detailViewController.journalEntry = childEntry 
detailViewController.context = childContext 
detailViewController.delegate = self 

に私はこれらの言葉の中にに走った:

をあなたがして(オブジェクトを使用する必要があります:)へ 管理対象オブジェクトが作成されたコンテキストに固有であるため、仕訳入力を取得します。

私はなぜあなたが1つのMOCから取得した管理オブジェクトを渡すことが厳しく禁じられているのか理解できないので、私は固執しました。なぜ誰かがあなたがそれを分解することができます知っている?

答えて

1

コアデータはスレッドセーフではありません。それはかなりです。

複数のスレッドでオブジェクトやメソッドを使用してもスレッドセーフではない場合は、災害を起こすことになります。破損したデータやアプリのクラッシュが一般的です。さらに悪いことに、常に発生することはありません。また、ユーザーごとに異なるタイミングで発生することもあります。これは、Core Dataだけでなく、マルチスレッドのコードにも当てはまります。

それはメッセージがあなたに語っているものではありません。 "...管理対象オブジェクトは、それらを作成したコンテキストに固有のものです。"これはまったく別の問題です。

管理対象オブジェクトを取得するときは、管理対象オブジェクトコンテキストを使用して管理対象オブジェクトを取得します。コンテキストとは、管理オブジェクトと基礎となる永続ストアファイルとの間のリンクです。他のコンテキストで管理オブジェクトを使用しようとすると、そのコンテキストはそれについて何も知らない。どのような方法でもオブジェクトを使用することはできません。これがあなたのコードからどこで起こっているのかを知るのは難しいですが、それがメッセージの意味です。

関連する問題