gpt4 book ai didi

ios - 控制 NSSortDescriptor 对 Core Data 中的 nil 值进行排序的方式

转载 作者:可可西里 更新时间:2023-11-01 03:07:07 24 4
gpt4 key购买 nike

对于带有核心数据的字符串,给定以下 NSSortDescriptor:

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

结果按字母升序正确排序。然而,在 seriesnil 的情况下,具有 nil 值的字符串被放置在顶部,之后对非 nil 值进行排序,例如:

[nil, nil, nil, A, B, C, D...]

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

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 对 Core Data 中的 nil 值进行排序的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25701511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com