不支持的 NSSortDescriptor(不支持比较器块)

Posted

技术标签:

【中文标题】不支持的 NSSortDescriptor(不支持比较器块)【英文标题】:unsupported NSSortDescriptor (comparator blocks are not supported) 【发布时间】:2013-02-18 14:31:24 【问题描述】:

fetchedResultsController 中设置NSSortDescriptor 时收到此错误不支持NSSortDescriptor(不支持比较器块)

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
                               entityForName:@"Alarm" inManagedObjectContext: managedObjectContext];
[fetchRequest setEntity:entity];

//Below code is not working and causing error. sorting use the hours&seconds part of the time attribute  

NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                          initWithKey:@"time" ascending:YES comparator:^NSComparisonResult(id obj1, id obj2) 

                                  NSCalendar *calendar = [NSCalendar currentCalendar];
                                  NSDateComponents *components1 = [calendar components:(NSHourCalendarUnit|NSMinuteCalendarUnit) fromDate:obj1];
                                  NSDateComponents *components2 = [calendar components:(NSHourCalendarUnit|NSMinuteCalendarUnit) fromDate:obj2];
                                  NSDate *date1 = [calendar dateFromComponents:components1];
                                  NSDate *date2 = [calendar dateFromComponents:components2];


                                  return [date1 compare:date2];

                          ];

【问题讨论】:

【参考方案1】:

您不能在任何地方使用带有比较器块的排序描述符 - 例如,不能使用 Core Data 提取。

不过,当您过滤普通数组时,它们可以正常工作。

除此之外 - 有没有我忽略的问题?

【讨论】:

我能做些什么来获得上述结果? @Anil 好吧,一种简单的方法是将所有数据提取到一个数组中,然后使用代码中的排序描述符对该数组进行排序。 我确实喜欢。获取后在外部排序。但问题是我使用controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath 来更新表格视图。在执行删除时,索引路径中的其他一些行将被删除。 我认为可能被忽视的部分是为什么首先不允许比较器块与 Core Data 获取一起工作的荒谬决定(在 Apple 方面)。还有如何在 Core Data fetches 中解决它。【参考方案2】:

正如 Monolo 所说,您不能将比较器块与 Core Data 一起使用。 但是,您可以使用:

[NSSortDescriptor sortDescriptorWithKey:(NSString *) ascending:(BOOL) selector:(SEL)]

如果您不使用标准选择器,则需要扩展您的模型。

例如,我只需要订购字符串“a la Finder”(即 1,2,9,10,而不是 1,10,2,9)并且我使用了

request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:myEntity ascending:NO selector:@selector(localizedStandardCompare:)]];

看看NSSortDescriptor Class Reference by Apple

编码愉快:)

【讨论】:

它在 Core Data 中不起作用。排序发生在 SQLite 后端。本地化标准比较有效,可能是因为它是 NSString 的选择器,而苹果做了一些事情来翻译它的比较方式。 对不起,我不明白你的评论:我的回答是“你不能在 Core Data 中使用比较器块”,我想很明显它在 Core Data 中不起作用... 我的意思是选择器也不适用于核心数据。就像我们在模型上有 @selector(fancyCompare:) 一样。它不适用于 Core Data。 挖掘这个僵尸,因为我发现 cmets 没有帮助 - 你必须使用内置的比较器选择器之一。见***.com/a/27972020/2200576。 +1 — 正在研究块以修复 [1, 10, 2] 排序问题。 localizedStandardCompare: 可以代替!

以上是关于不支持的 NSSortDescriptor(不支持比较器块)的主要内容,如果未能解决你的问题,请参考以下文章

NSSortDescriptor 不排序 NSArray

NSSortDescriptor 不起作用

Swift 4.2 中的 NSSortDescriptor 区分大小写

执行获取请求时,我必须在核心数据中提供 NSSortDescriptor 吗?

在托管对象上下文中添加 NSSortDescriptor 以获取请求?

当第一个描述符是 NSDate 时,多个 NSSortDescriptor 不起作用