0

NSManagedObject同じスレッドで実行されている2 つ以上のNSManagedObjectContextオブジェクト間で を共有する方法があるかどうか疑問に思っていました。

次の問題があります。アプリケーション内のすべてのコードで共有される 1 つのメイン コンテキストと、発行するリモート フェッチ要求ごとに作成されるいくつかの異なるコンテキストがあります。(リモートでフェッチし、サーバーで見つかったすべてのオブジェクトを自分の に挿入するカスタム クラスを作成しましたNSManagedObjectContext)。これらのフェッチ要求はNSURLConnection、異なる時間に終了する可能性のあるオブジェクトを使用するため、同時に実行される可能性があります。同じリモート オブジェクトが異なる接続によってフェッチされると、コンテキストを保存してメインのオブジェクトとマージするときに重複が発生します。(つまり、リモート ID は同じで が異なるオブジェクトobjectID)。

考えられる解決策の 1 つは、すべてのオブジェクトが作成されるとすぐに保存 (および永続化) することですが、まだ満たされていない可能性があり、保存操作中に検証されない関係がある可能性があるため、それはできません。

コンテキスト間でオブジェクトの同じ非永続インスタンスを共有できるメソッドを本当に楽しみにしています。誰かがこの問題に遭遇し、解決策を思いついた場合は、喜んでお知らせします!

4

2 に答える 2

1

コンテキストは、ストアを介して保存して相互に通信できません。ただし、管理対象オブジェクト コンテキストが nil の管理対象オブジェクトを挿入することはできます。その場合、そのオブジェクトは (関係はなくても) どのコンテキストからも独立します。その独立した管理対象オブジェクトを必要に応じて渡し、永続化する必要があるときにコンテキストに挿入することができます。これは危険ですが可能です。

ただし、各接続を個別のスレッドで実行していない場合は、複数のコンテキストを使用しても何も得られません。各接続オブジェクトは、メイン スレッドでデリゲートを順番にアクティブにします。この場合、最も簡単な解決策は、すべての接続に同じデリゲートを使用し、デリゲートが単一のコンテキストへの挿入を処理できるようにすることです。重複を防ぐには、remoteID に対してフェッチを実行し、その remoteID の新しいオブジェクトを挿入する前に、現存するオブジェクトが返されるかどうかを確認します。

于 2010-07-23T13:04:19.947 に答える
0

あなたがやりたいことは不可能だと思います。つまり、異なるコンテキスト間で変更を共有したい場合は、通知を使用して、保存または変更が発生するたびに通知をマージする必要があります。しかし、あなたの場合、1つのコンテキストを使用して、最後に保存すると思います。または、あまり洗練されていない方法:すべてのリモートIDをアプリに一時的に保存し、新しいIDを挿入する前に確認してください。この場合、複数のコンテキストを引き続き使用して、didfinishloadingごとに保存できます。

于 2013-02-20T02:14:03.970 に答える