4

バックグラウンドでの作業に関する CoreData Apple Docs で、次のようなアドバイスを見つけました。

たとえば、オブジェクト ID のみを返すだけでなく、行データも含める (および行キャッシュを更新する)ようにフェッチ要求を構成できます。これは、これらのオブジェクト ID をバックグラウンド スレッドから別のスレッドに渡すだけの場合に役立ちます。 .

この取得リクエストをどのように実装するのだろうかと思っていました。具体的には、行キャッシュを更新する方法。

これがIDだけを取得する方法だと思います

NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"MyItem"]; // iOS 5 method
request.returnsObjectsAsFaults = YES; 

残りはどうすればいいですか?

4

2 に答える 2

16

デフォルトでは、includesPropertyValues は YES であり、returnsObjectsAsFaults も YES です。

オブジェクト ID を返すだけの場合は、次を使用する必要があります...

fetchRequest.resultType = NSManagedObjectIDResultType;

ただし、フェッチするプロパティはなく、行キャッシュは移入されません。一連のオブジェクト ID が返されるだけです。

BY DEFAULT (resultType == NSManagedObjectResultType) では、includesPropertyValues と returnObjectsAsFaults の両方が YES であるため、フェッチはオブジェクトをフォールトとして返し (オブジェクト ID にアクセスできます)、行キャッシュがいっぱいになることに注意してください。オブジェクトはまだ障害であるため、「メモリ内」になります...しかし、オブジェクトIDを取得することはできます。

あとは、オブジェクトに objectID を尋ねるだけです。

あなたが求めている動作がデフォルトで得られるものであると言うだけです。それで、あなたは問題を抱えていますか、それともあなたがそのような振る舞いをしていないと思う理由がありますか?

編集

うーん...私はデフォルトで、あなたが望むものを手に入れていると言っています。フェッチ リクエストに入力するだけで、属性をまったく変更しない場合、returnsObjectsAsFaults は YES になります。したがって、返されるオブジェクトはエラーになります。さらに、includesPropertyValues も YES であるため、行キャッシュである程度のプロパティ データを使用できます。

managedObject.objectID を呼び出すことで、objectID プロパティにアクセスできます。

編集

申し訳ありませんが、同じことを言うのはこれで 3 回目になるため、明らかにうまくコミュニケーションが取れていません。

NSFetchRequest を作成すると、デフォルトで設定されるいくつかのプロパティがあります。

デフォルトでは、resultType は NSManagedObjectResultType に設定されています。つまり、変更しない限り、NSManagedObjectResultType のままです。また、フェッチから取得した結果の配列には、NSManagedObjects の配列が含まれることも意味します (カウント、辞書、または ObjectID を取得するのではなく)。

returnObjectsAsFaults はデフォルトで YES に設定されています。つまり、変更しない限り、YESのままです。また、フェッチから返されたオブジェクトが障害になることも意味します。NSManagedObject は、プロパティ データでは実現されません。オブジェクトはフォルトになります。そのタイプ、オブジェクト ID、およびその他のものを知るのに十分なメタデータがあります。

includesPropertyValues はデフォルトで YES に設定されています。つまり、変更しない限り、YESのままです。また、ある程度のプロパティ データが行キャッシュにフェッチされることも意味します。

フェッチから返される各 NSManagedObject は次のようになります。

  1. オブジェクト ID を持つ
  2. データが実際にメモリに完全にロードされていないため、エラーになる
  3. 行キャッシュには、ある程度のプロパティ データが含まれます。

これはあなたが求めているすべてです。他に何を追加できるかわかりません(もう一度繰り返しませんが)。

また、オブジェクト ID だけが必要な場合は、resultType を NSManagedObjectIDResultType に設定できます。

NSFetchRequest ドキュメントから直接...

includePropertyValues

includesPropertyValues を NO に設定すると、プロパティ値を表すオブジェクトの作成を回避してメモリ オーバーヘッドを削減できます。ただし、通常は、実際のプロパティ データが必要ないか、行キャッシュに情報が既にあることが確実な場合にのみ行ってください。そうしないと、データベースへの複数回のトリップが発生します。

通常のフェッチ中 (includesPropertyValues が YES)、Core Data は一致するレコードのオブジェクト ID とプロパティ データをフェッチし、行キャッシュに情報を格納し、管理対象オブジェクトを障害として返します (returnsObjectsAsFaults を参照)。これらのフォルトは管理対象オブジェクトですが、フォルトが発生するまで、それらのすべてのプロパティ データは引き続き行キャッシュに存在します。障害が発生すると、Core Data は行キャッシュからデータを取得します。データベースに戻る必要はありません。

includesPropertyValues が NO の場合、Core Data は一致するレコードのオブジェクト ID 情報のみをフェッチし、行キャッシュにはデータを入力しません。障害を作成するために必要なのは管理対象オブジェクト ID のみであるため、Core Data は引き続き管理対象オブジェクトを返します。ただし、後でフォールトを発生させると、Core Data は (空の) 行キャッシュを調べますが、データが見つからず、ストアに戻ってデータをもう一度探します。

と...

returnObjectsAsFaults

デフォルト値は YES です。オブジェクト ID にはプロパティ値がないため、結果タイプ (resultType を参照) が NSManagedObjectIDResultType の場合、この設定は使用されません。返されたオブジェクトからプロパティ値にアクセスする必要があることがわかっている場合は、returnsObjectsAsFaults を NO に設定してパフォーマンスを向上させることができます。

デフォルトでは、fetch returnsObjectsAsFaults を実行すると YES になります。Core Data は、一致するレコードのオブジェクト データをフェッチし、行キャッシュに情報を格納して、管理対象オブジェクトを障害として返します。これらのフォルトは管理対象オブジェクトですが、そのプロパティ データはすべて、フォルトが発生するまで行キャッシュに存在します。障害が発生すると、Core Data は行キャッシュからデータを取得します。この操作のオーバーヘッドは小さいですが、大規模なデータセットの場合、自明ではなくなる可能性があります。返されたオブジェクトからプロパティ値にアクセスする必要がある場合 (たとえば、特定の属性の平均値を計算するためにすべてのオブジェクトを反復処理する場合)、追加のオーバーヘッドを回避するために、returnsObjectsAsFaults を NO に設定する方が効率的です。

于 2012-05-10T13:26:09.763 に答える
8

簡単に説明してみよう

デフォルトでNSFetchRequestは、

resultType: NSManagedObjectResultType

returnsObjectsAsFaults: YES

includesPropertyValues: YES

ここで、返されるオブジェクト (メモリ内) にはobjectIDプロパティのみがあり、他のすべてのプロパティは空です (これはfaultと呼ばれるものです)

includePropertyValues

YES: オブジェクト プロパティが行キャッシュ(CoreData の特別なキャッシュ) にあることを意味するため、これらのプロパティにアクセスすると、CoreData は行キャッシュでそれらを検索します。

いいえ: 行キャッシュがないことを意味します。これらのプロパティにアクセスすると、CoreData は SQLite を再度クエリします。

returnObjectsAsFaults

YES: includesPropertyValues が有効になることを許可します (フォルトを許可することを意味します)

いいえ: メモリ内のすべてのプロパティを持つオブジェクトを返します

: 障害には、管理対象オブジェクト障害関係障害の 2 種類があります。

詳しくはこちらをお読みください。

したがって、あなたの場合、デフォルトで遊んでください

于 2014-04-11T08:17:18.530 に答える