0

私のアプリケーションは、スレッドごとに1つの管理対象オブジェクトコンテキストを持つ複数のスレッドを使用します。

わかりやすくするために、さまざまな管理対象オブジェクトのコンテキストをmoc1、moc2、...などと呼びます。

単純な1対多の関係を持つ2つのモデルがあると仮定しましょう。

User 1----* Document

ユーザーがログインすると、コンテキストの1つ(例:moc1)から対応するモデルをフェッチします。

(擬似コード)

UserModel *globalLoggedUser = ( Fetch the logged in user using moc1 )

次に、後で参照できるように、このユーザーを保存します。

アプリケーションの別の部分では、配列から何千ものアイテムをループして、そのためのDocumentオブジェクトを作成する必要があります。次に、各ドキュメントを現在のユーザーにバインドする必要があります。これは、別のバックグラウンドスレッド(独自のコンテキストを持つ)で発生します

for( NSString *documentName in documents) {
    ( Create new document using moc2 )

    ** THIS IS WHERE MY PROBLEM IS **
    // What I currently do:
    UserModel *tempUser = ( Fetch the logged in user using moc2 )
    ( bind new document to tempUser )

    // What I would like to do: 
    ( bind new document to globalLoggedUser )

    // Note that in this case tempUser and globalLoggedUser are the same user, except they are attached to different contexts.

}

ご覧のとおり、毎回新しいユーザーを現在のコンテキストにフェッチする必要はありません。

問題は、globalLoggedUserがmoc1の一部であるのに対し、新しいドキュメントはmoc2の一部である(またはmoc3、moc4などはスレッドによって異なります)ということです。

それで、これについて行くための最良の方法は何ですか?オブジェクトをグローバルに保存/キャッシュしてから、同じオブジェクトを使用して、毎回フェッチする必要があるというペナルティを発生させることなく、異なるコンテキストで関係をバインドするにはどうすればよいですか?

あなたが提供できるどんな助けにも感謝します。

4

1 に答える 1

1

スレッド間で同じNSManagedObjectを使用することはできないというのは正しいことです。

Core Dataプログラミングガイドから:

スレッド制限を使用して、スレッド間で管理対象オブジェクトまたは管理対象オブジェクトコンテキストを渡さないでください。スレッドの境界を越えて、あるコンテキストから別のコンテキストに管理対象オブジェクトを「渡す」には、次のいずれかを行います。

  • オブジェクトID(objectID)を渡し、管理対象オブジェクトコンテキストの受信時にobjectWithID:またはexistingObjectWithID:error:を使用します。

    対応する管理対象オブジェクトが保存されている必要があります。新しく挿入された管理対象オブジェクトのIDを別のコンテキストに渡すことはできません。

  • 受信コンテキストでフェッチを実行します。

'document'ループを実行する前に、ログインしたユーザーをmoc2でフェッチしただけであれば、ループ内で毎回フェッチを実行する理由がないため、問題ないと思います。(あなたがそれをしている理由はありますか?)

スレッド1からUserModelに何かをバインドすることについて心配する必要はありません。moc2から取得するtempUserは、データベース内のglobalLoggedUserと同じデータを参照しています。

于 2012-05-06T15:45:42.787 に答える