【发布时间】:2016-02-02 22:59:21
【问题描述】:
我一直在使用基于块的方法对NSArray 进行排序...但是,我注意到了一个与排序相关的错误,因此开始调查。
背景:我正在处理 NSArray 的 EKReminder 对象,它们具有 creationDate 属性。我想按降序 creationDate(最新的提醒,第一)对提醒进行排序。
这是我的上一个代码:
// NSArray* fetchedReminders... contents pulled from reminder calendars...
NSArray* sortedArray = [fetchedReminders sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
NSDate* first = [(EKReminder*)a creationDate];
NSDate* second = [(EKReminder*)b creationDate];
return [second compare:first];
}];
我相信那个代码是正确的。但是,我最终在数据库中发现了一些以null 作为创建日期的提醒。这引入了一个错误 - 结果排序不正确。 null 值既不在开头也不在结尾,而且数组中的空值似乎与这种比较方法混为一谈,因为许多提醒不按顺序排列。
NSSortDescriptor
所以,我尝试更换基于块的方法以支持sortedArrayUsingDescriptors。这是当前代码:
// NSArray* fetchedReminders... contents pulled from reminder calendars...
NSSortDescriptor* sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO];
NSArray* sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray* sortedArray = [fetchedReminders sortedArrayUsingDescriptors:sortDescriptors];
这行得通。
(根据当前数据,101条提醒,其中6条的创建日期为null,都放在最后,其他提醒顺序正确)。
问题
首先,我在 sortedArrayUsingComparator 方法上做错了吗?
如果不是,这些不同的方法是否会以不同的方式处理nulls?
无论如何,如果您的数据中可能包含nulls,这是否会使NSSortDescriptor 方法成为首选方法?
【问题讨论】:
-
我觉得你最好解释一下。 “NS”集合(NSArray、NSDictionary、NSSet、NSTree 以及它们的可变对应物)中的任何条目都不能有任何 null。 Cocoa 在尝试将 nil 值或键插入其集合时崩溃。您可能指的是另一个问题 --- 数组中的 NSNull 对象,应视为特殊情况。
标签: ios objective-c sorting nsarray