5

私の問題は非常に奇妙で、助けを求めています。私のシステムがどのように機能するかを説明したいと思います。これには2つの問題があります。

2 つのテーブルを持つアプリケーションを作成しています。コアデータを使用しています。テーブルはCategoriesProductsです。コア データでは、1 対多の関係を確立しました。 Categoryは複数のProductsを持つことができ、Productは 1 つのCategroyを持つことができます。

ここに基本的なスキーマがあります

Category {
  site_id
  name
  allProducts ->> Product
}

Product {
  site_id
  name
  category -> Category
}
  • これは単純化されたモデル製品であり、カテゴリにはより多くのプロパティがあります

そのアプリケーションには更新プロセスがあり、そのプロセスはバックグラウンド スレッドで動作します。そのスレッドのコンテキストと、そのコンテキストに保存しているすべての変更を作成しました。

バックグラウンドスレッドで実行しているすべての計算

[context performBlock:^{
  // all my operations for updating storing categories and products
}]

更新の流れです

  1. サーバーから、カテゴリ データを含む JSON を取得します
  2. サーバーから、製品データを含む JSON を取得します
  3. サーバーから、どのカテゴリにどの製品があるかという情報を含む JSON を取得しますarray((category_site_id > array(product_site_id1, product_site_id2...))

  4. カテゴリ JSON を通過し、カテゴリ エンティティを格納します。JSON から name と site_id を取得し、エンティティを作成してこれらのプロパティを設定します

  5. 製品 JSON を渡し、製品エンティティを作成し、JSON のプロパティから name と store_id を設定します

続いて本編

  1. ここで、ステップ 3 で取得した JSON に基づいて製品をカテゴリに接続する必要がありますが、ここに問題があります。

JSON から foreach カテゴリに移動し、すべての製品 site_id を NSArray として取得します。述語と IN 基準を含むフェッチ要求を使用して、site_id IN 配列を持つコンテキストからすべての製品エンティティを取得します。しかし、私は常にゼロの結果を得ました。バックグラウンド スレッドのコンテキストでフェッチ結果を呼び出しており、ステップ 3 と 4 でそのコンテキストも更新しているため、これは奇妙です。

次に、次のことを試します。ステップ 6 の前に[context save:&error]約 30 秒のスリープを追加し、そのプログラムがステップ 6 に入った後、すべてがうまく機能すると、フェッチ結果が IN 基準の述語を含む製品を取得します。あなたが私を理解していれば、それは私の最初の問題です.IDで製品を取得できません.SQLLiteDBへのコンテキストストアに約30秒待つ必要があります.これは非常に奇妙です. また、id による fetch リクエストでカテゴリを取得したい場合、問題なく取得できるため、これは奇妙です(手順 5 に約 1 分かかるためでしょうか)。

次の問題は、その 30 秒待ってから、カテゴリを通過することです。カテゴリ site_id に基づいて、コンテキストからカテゴリ エンティティを取得し、ステップ 6 で、JSON によって取得された製品 site_ids に基づいてすべての製品を取得し、要求をフェッチして、製品をカテゴリに追加したいので、次を呼び出します

[category setAllProducts:results] // 結果は製品の NSSet、カテゴリはエンティティ オブジェクト

NSError *エラー = nil; [コンテキスト保存:&エラー];

そして、foreach categroy を実行します (手順 3 でサーバーから JSON 形式で取得)

すべてが完了すると、UI のカテゴリに製品が表示されません。また、すべてのデータが DB に保存されるまでしばらく待っていますが、ヘプネは何もありません。

その後、アプリケーションを停止して再度実行すると、カテゴリ内の製品が表示されます:(

非常に奇妙な問題です。どこが間違っているのかわかりません。助けてください。コードの一部を投稿できます。コードは小さくなく、プロセスの説明に基づいて助けを求めています。

どうもありがとうございました

4

1 に答える 1

13

私の理解では、子コンテキストを使用しています。子コンテキストは、対処しなければならない多くの (多くの! ) バグの影響を受けます。

ここでそのトピックに関するかなり良い記事:

http://wbyoung.tumblr.com/post/27851725562/core-data-growing-pains

この問題に関する私のアドバイスは、子コンテキストではなく、ストア コーディネーターに直接接続されたコンテキストを使用することです。このような設定を使用すると、すべてが正常に機能します。もちろん、プライベート キュー コンテキストを使用できます。

于 2012-08-10T11:12:45.627 に答える