2013-03-25 3 views
1

Я делаю NSFetchRequest со следующим предикатом:Сортировка NSArray по NSOrderedSet

[NSPredicate predicateWithFormat:@"index IN %@", indexes]; 

... где indexes является NSOrderedSet чисел.

Это дает мне массив «случайно отсортированных» объектов с заданными индексами. Мне нужно отсортировать его так, чтобы объекты отображались в том же порядке, что и в упорядоченном наборе.

Что было бы самым эффективным способом сделать это?

Update

Вот категория основана на ответ Мартина АиР:

@implementation NSArray (SortUsingValues) 

- (NSArray *)sortedArrayUsingValues:(NSOrderedSet *)values keyPath:(NSString *)keyPath 
{ 
    NSAssert([values isKindOfClass:[NSOrderedSet class]], nil); 
    NSAssert([keyPath isKindOfClass:[NSString class]], nil); 
    return [self sortedArrayUsingComparator:^NSComparisonResult(id object, id otherObject) { 
     id value = [object valueForKeyPath:keyPath]; 
     id otherValue = [otherObject valueForKeyPath:keyPath]; 
     NSUInteger indexOfValue = [values indexOfObject:value]; 
     NSUInteger indexOfOtherValue = [values indexOfObject:otherValue]; 
     if (indexOfValue > indexOfOtherValue) return NSOrderedDescending; 
     else if (indexOfValue < indexOfOtherValue) return NSOrderedAscending; 
     else return NSOrderedSame; 
    }]; 
} 

@end 

ответ

1

Я не могу придумать способ, чтобы использовать дескриптор сортировки в запросе выборки для этой цели. Но вы можете отсортировать массив результатов после выборки в соответствии с индексами:

NSArray *sorted = [results sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    NSUInteger idx1 = [indexes indexOfObject:[obj1 valueForKey:@"index"]]; 
    NSUInteger idx2 = [indexes indexOfObject:[obj2 valueForKey:@"index"]]; 
    return idx1 - idx2; 
}]; 
+0

Спасибо, это именно то, что я искал. Кстати, я только что обновил свой вопрос с категорией, основанной на вашем ответе. –