1

NSManagedObject Aaと 1 を仮定しBます。Aで対多B関係になりましたbs。is [A.bs filter...]with someは非常に便利ですが、同じ述語と関係に一致する条件を使用してonをNSPredicate構築するよりも遅くなる可能性がありますか、それとも間違っていますか?NSFetchRequestB

lastObject結果に対して次のようなことを行って単一の結果のみを取得すると、このパフォーマンスの問題はさらに悪化すると思います。(は、この目的に利用できるプロパティをNSFetchRequest提供します)。fetchLimit

同様に、1 つまたは 2 つのプロパティにのみ関心がある場合はNSFetchRequest、プロパティも提供しpropertiesToFetchます。

この背後にある私の推論は、リレーションを直接使用するには、コア データをすべてNSManagedObjects関連する に取り込む必要があるということNSManagedObjectContextです。はNSFetchRequest店舗レベルで最適化を実行できます。

今:

  • 私の推論は正しいですか?したがって、すべての関係オブジェクトに関心がない場合は、 NSFetchRequest?
  • 同様のパフォーマンスを持つ関係を介して便利な(そして明らかに読みやすい)アプローチを持つソリューションはありますか?
4

2 に答える 2

0

あなたの推論は正しいです。

NSFetchRequestsを追加すると、リクエストを最適化するための柔軟性と機会が大幅に増えます。

フェッチ要求は、基盤となるデータベースのインデックスを使用できます。フェッチ要求は、オブジェクトを完全にロードする代わりに、障害としてオブジェクトを取得できます。フェッチ要求は、選択したいくつかの属性をプリロードできます。彼らはあなたのためにいくつかの操作を実行することさえできます(NSExpressionDescription、NSExpressionを参照)。..。

メモリ内フィルタリングを使用する必要がある場合でも(たとえば、objectsWithOptions:passingTest:を使用)、フェッチ要求を使用して、必要なオブジェクトと属性をプリロードする必要があります。多くの障害解決は、どのような場合でも遅くなります。

于 2012-06-19T08:14:42.943 に答える
0

はい、フィルタリング アプローチは実際には、最初にすべてのオブジェクトを NSSet にフェッチしてから -filteredSetUsingPredicate: をコア データの範囲外にある NSSet に送信する 2 段階のアプローチですが、パフォーマンスに関するフェッチ リクエストは最適化を使用できるというあなたの仮定は正しいです。 .

1 つの代替方法は、モデルでフェッチ リクエスト テンプレートを使用し、[managedObjectModel fetchRequestFromTemplateWithName:substitutionVariables:] を使用してコードでインスタンス化することです。

于 2012-06-19T07:30:55.213 に答える