【问题标题】:Sorting NSArray by NSOrderedSet通过 NSOrderedSet 对 NSArray 进行排序
【发布时间】:2013-03-15 02:39:22
【问题描述】:

我正在使用以下谓词执行NSFetchRequest

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

...其中indexes 是一个NSOrderedSet 的数字。

这给了我一个具有给定索引的“随机排序”对象数组。我需要对此进行排序,以便对象以与有序集中相同的顺序出现。

最有效的方法是什么?

更新

这是基于 Martin R 回答的类别:

@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

【问题讨论】:

    标签: cocoa core-data nsarray nssortdescriptor nsorderedset


    【解决方案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;
    }];
    

    【讨论】:

    • 谢谢,这正是我想要的。顺便说一句,我刚刚根据您的回答用一个类别更新了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    相关资源
    最近更新 更多