给定具有核心数据的字符串的以下NSSortDescriptor:

[NSSortDescriptor sortDescriptorWithKey:@"series" ascending:true selector:@selector(caseInsensitiveCompare:)]

结果按字母顺序正确地升序排列。但是,在seriesnil的情况下,具有nil值的字符串放在顶部,然后将非null值排序,例如
[nil, nil, nil, A, B, C, D...]

有什么办法可以控制这种行为?核心数据不允许使用自定义选择器。这是我的一个类似问题(但是没有解决核心数据的限制):

NSSortDescriptor and nil values

最佳答案

虽然不能将自定义选择器与Core Data一起使用,但是可以将NSSortDescriptor子类化以更改默认行为。这样的事情应该起作用:

#define NULL_OBJECT(a) ((a) == nil || [(a) isEqual:[NSNull null]])

@interface NilsLastSortDescriptor : NSSortDescriptor {}
@end

@implementation NilsLastSortDescriptor

- (id)copyWithZone:(NSZone*)zone
{
    return [[[self class] alloc] initWithKey:[self key]
                           ascending:[self ascending] selector:[self selector]];
}

- (id)reversedSortDescriptor
{
    return [[[self class] alloc] initWithKey:[self key]
                           ascending:![self ascending] selector:[self selector]];
}

- (NSComparisonResult)compareObject:(id)object1 toObject:(id)object2
{
    if (NULL_OBJECT([object1 valueForKeyPath:[self key]]) &&
        NULL_OBJECT([object2 valueForKeyPath:[self key]]))
        return NSOrderedSame;

    if (NULL_OBJECT([object1 valueForKeyPath:[self key]]))
        return NSOrderedDescending;

    if (NULL_OBJECT([object2 valueForKeyPath:[self key]]))
        return NSOrderedAscending;

    return [super compareObject:object1 toObject:object2];
}

@end

关于ios - 控制NSSortDescriptor对核心数据中的零值进行排序的方式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25701511/

10-13 04:00