通过订单获取集合

时间:2014-07-13 13:47:32

标签: ios objective-c core-data nsfetchrequest

我的核心数据对象如下所示:

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数组

2 个答案:

答案 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];