0

ソート記述子では表現できない方法でソートする必要があるオブジェクトがいくつかあります (ツリー内の位置が関係します)。現時点では、バックグラウンド スレッドを並べ替え、オブジェクト ID を収集してから、次のようにメイン コンテキストに戻しています。

for (NSManagedObjectID *objectID in objectIDs)
{
    NSManagedObject *managedObject = [mainContext existingObjectWithID:objectID error:outError];
    if (!managedObject) return nil;
    [array addObject:managedObject];
}

これには多くの DB ヒットが含まれるため、一度に実行することをお勧めします。Core Data Programming Guideでは、次のような述語を使用してこれを行うことを推奨しています。

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:[MyEntity entityName]];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", objectIDs];
NSArray *array = [mainContext executeFetchRequest:fetchRequest error:&error];

@"SELF IN %@"ただし、他の場所では a を使用してソート記述子を提供しているため、順序が失われるのではないかと心配しています。コア データ バッチ フォールトは順序を維持しますか?

4

2 に答える 2

1

述語を含むフェッチ リクエスト

[NSPredicate predicateWithFormat:@"SELF IN %@", objectIDs]

オブジェクト ID が配列に格納されているのと同じ順序でオブジェクトを返すわけではありません。私は小さなテストをしました:

NSLog(@"%@", objectIDs);
// "0x102005370 <x-coredata://FA77144F-F37B-455C-AC6F-18563A34C4A7/Question/p5>",
// "0x102003700 <x-coredata://FA77144F-F37B-455C-AC6F-18563A34C4A7/Question/p4>",
// "0x1020036f0 <x-coredata://FA77144F-F37B-455C-AC6F-18563A34C4A7/Question/p1>"

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Question"];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", objectIDs];
NSArray *array = [context executeFetchRequest:fetchRequest error:&error];
NSLog(@"%@", array);
// "<Question: 0x10201ae10> (entity: Question; id: 0x1020036f0 <x-coredata://FA77144F-F37B-455C-AC6F-18563A34C4A7/Question/p1> ; data: <fault>)",
// "<Question: 0x10201afe0> (entity: Question; id: 0x102003700 <x-coredata://FA77144F-F37B-455C-AC6F-18563A34C4A7/Question/p4> ; data: <fault>)",
// "<Question: 0x10201b060> (entity: Question; id: 0x102005370 <x-coredata://FA77144F-F37B-455C-AC6F-18563A34C4A7/Question/p5> ; data: <fault>)"

起動引数「-com.apple.CoreData.SQLDebug 3」を設定することで、fetch リクエストが SQLite クエリに変換されていることがわかります

SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZTEXT, t0.ZTITLE FROM ZQUESTION t0 WHERE  t0.Z_PK IN  (5,4,1)

t0.Z_PK IN (5,4,1)テーブル内のすべての行にテストを適用します。したがって、フェッチ要求の配列内のオブジェクトの順序は、返されるオブジェクトの順序には影響しません。

于 2013-03-21T19:06:30.723 に答える
0

非常に確実にしたい場合は、「インデックス」属性を作成し、エンティティをその配列にロードするときにエンティティに追加します。そうすれば、ソート記述子を「インデックス」に設定するだけで、確実に機能することが保証されます。

于 2013-03-21T18:30:24.417 に答える