我有一些对象,我需要以一种我无法用排序描述符表达的方式进行排序(它涉及树中的位置)。目前我正在将它们排序为后台线程,收集它们的objectID,然后将它们返回到主上下文中,如下所示:
for (NSManagedObjectID *objectID in objectIDs)
{
NSManagedObject *managedObject = [mainContext existingObjectWithID:objectID error:outError];
if (!managedObject) return nil;
[array addObject:managedObject];
}
这涉及很多数据库命中,所以我更愿意一次性完成。 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 %@"
并提供排序描述符。核心数据批处理错误是否会保留排序?
答案 0 :(得分: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)
应用于表中的所有行。因此,获取请求数组中对象的顺序不会影响返回对象的顺序。
答案 1 :(得分:0)
如果你想要超级确定,我只想创建一个'index'属性,并在将它们加载到该数组时将其添加到实体中。这样你就可以简单地将排序描述符设置为'index'并保证它能够正常工作。