2

マップに注釈を追加する必要があります。各注釈には、リモート サーバーからフェッチされている対応する Place リソースがあります。各場所には関連付けられたカテゴリがあります。これもサーバーから個別のリソースとして取得されます。

特定の地域に居住するために、それぞれが 20 のカテゴリの 1 つに属する 100 の場所を取得する必要があるとします (実際には、さらに多くのカテゴリがあります)。

AFNetworking を使用して両方のリソースをフェッチします。場所とカテゴリの両方をオフラインで使用できるようにキャッシュしようとしているので、注釈がマップに表示される前に、取得したリソースを Core Data テーブルに書き込みます。

各場所は、関連するカテゴリ リソースを必要に応じて取得します。場所を「場所」テーブルに、カテゴリを「カテゴリ」テーブルに書き込む必要があります。

フェッチは非同期で行われるため、特定のカテゴリをテーブルに書き込むときに、別の場所の「スレッド」が同じ関連付けられたカテゴリを「カテゴリ」テーブルに書き込もうとしているかどうかはわかりません。

そこで問題は、非同期で取得した情報をコア データ テーブルに入力する必要がある場合に、コア データ テーブルを操作するためのパターンは何かということです。具体的には、カテゴリを書き込もうとしている特定のスレッドが、それを行おうとしているスレッドが既に存在することをどのように知ることができるのでしょうか?

更新 1: 現在の問題は、現在、カテゴリが重複していることです。私の推測では、明らかに、書き込まれようとする各カテゴリは、同じカテゴリの並列書き込みについて認識していません。

更新 2: 私の場合の最も簡単な説明は次のとおりです。

あるスレッドでいくつかのフィールドを持つ新しいカテゴリ エンティティを作成し、その間に別のスレッドで、最初のスレッドと同じカテゴリ オブジェクトを目指して同じフィールドを持つまったく同じカテゴリ エンティティを作成します。

1 つのスレッドが[managedObjectContext save:&error]の呼び出しに勝ちますが、実際のレコードが PersistentStore に表示される前に、2 番目のスレッドも保存を呼び出します。問題は、「カテゴリ」テーブルでレコードの重複を防ぐ方法です。

更新 3: 管理オブジェクト コンテキストを使用する両方のバリアントを検討しています: 1) すべてのスレッドで 1 つの共有 moc インスタンスを再利用する 2) 各スレッドで新しい moc をインスタンス化する

ありがとう!

4

1 に答える 1

2

「公式」の答えは、コンテキストを作成したのと同じスレッドでNSOperationQueueへのすべてのアクセスが確実に行われるように、 を使用したり、手動の手順を実行したりすることです。このアプローチを実装するために従うことができる参照とチュートリアルNSManagedObjectContextが多数あります。

別の方法として、これを行うスレッドセーフな Core Data 拡張機能が github にあります。これを使用すると、データベース操作が自動的に同期されるため、別のスレッドがコンテキストで何かを行っているかどうかを心配する必要はありません。入ってきたものを挿入するだけで、フレームワークは、操作が Core Data を爆発させないものに変換されることを保証します。

完全な開示: 私は github プロジェクトを構築しました。

于 2012-10-08T23:53:06.450 に答える