0

我有一些对象需要以我无法用排序描述符表达的方式进行排序(它涉及树中的位置)。目前我正在将它们排序为后台线程,收集它们的 objectID,然后将它们返回到主上下文,如下所示:

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

这涉及到很多数据库点击,所以我更愿意一次性完成。核心数据编程指南建议使用这样的谓词这样做:

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

但是,我担心我会丢失排序,因为在其他地方他们使用 a@"SELF IN %@"并提供排序描述符。核心数据批量故障是否保留顺序?

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”,可以看到获取请求被翻译成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 回答