我的核心数据对象如下所示:
Person
-------
presonId
name
现在假设我有一个personsIds
数组,我想获取包含此Person
数组的所有personsIds
个对象。
所以我的获取请求将是:
NSArray *personsIds = [self getPersonsIds];
// fetch all persons with ids in personsIds
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
request.predicate = [NSPredicate predicateWithFormat:@"presonId in %@", personsIds];
NSArray *results = [self.context executeFetchRequest:request error:&anyError];
现在我的问题是:
personsIds
的顺序很重要,我希望results
数组按照相同的顺序排序。
我无法处理personId
数组,无法对其进行排序等。
请注意personsIds
数组可能包含的对象多于results
数组
答案 0 :(得分:0)
您可以使用NSSortDescriptor
对提取请求结果进行排序:
NSSortDescriptor *sort1 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSSortDescriptor *sort2 = [[NSSortDescriptor alloc] initWithKey:@"personId" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObjects:@[sort1, sort2]];
排序描述符的外观取决于您希望如何对结果进行排序。这取决于您的personIds
数组的排序方式。
如果您无法以一般方式描述排序,则需要循环搜索结果并手动对其进行排序。
答案 1 :(得分:0)
正如科尼利厄斯所说,你使用排序描述符。在您的情况下,排序被定义为“按照其他列表的顺序”。所以我们需要一种方法将personId映射到“原始列表中的索引”,然后对其进行排序。让我们构建一个NSComparator
来帮助我们(这些都没有经过实际测试,但它应该编译):
NSComparator comparatorForOriginalList(NSArray *list, NSString *key) {
NSArray *order = [list valueForKey:key]; // The personIds in the order we want
return ^(id obj1, id obj2) {
// We're passed personIds, map them to their locations
NSUInteger idx1 = [order indexOfObject:obj1];
NSUInteger idx2 = [order indexOfObject:obj2];
// And do the surprisingly tedious task of comparing them (why is this still so hard?)
if (idx1 > idx2) {
return (NSComparisonResult)NSOrderedDescending;
}
if (idx1 < idx2) {
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
};
}
给定一个列表和一个键,这将返回一个函数,该函数将列表中该键的第一个对象值的位置与第二个对象的位置进行比较,并告诉您它们是否符合顺序。
有了这个,创建排序描述符很简单:
NSString *key = @"personId";
NSComparator comparator = comparatorForOriginalList(originalList, key);
NSSortDescriptor *sorter = [NSSortDescriptor sortDescriptorWithKey:key
ascending:YES
comparator:comparator];