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

Ani*_*ese 9 nssortdescriptor nsfetchedresultscontroller ios

fetchedResultsController设置NSSortDescriptoriam时,获得此错误的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];

                          }];
Run Code Online (Sandbox Code Playgroud)

Mon*_*olo 9

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

但是,当您过滤普通数组时,它们可以正常工作.

除此之外 - 那里有一个我忽略的问题吗?

  • 我确实喜欢那样.获取后外部排序.但问题是使用`controller:(NSFetchedResultsController*)控制器didChangeObject:(id)anObject atIndexPath:(NSIndexPath*)indexPath forChangeType:(NSFetchedResultsChangeType)类型newIndexPath:(NSIndexPath*)newIndexPath`用于更新表视图.执行删除时,indexpath中的其他行将被删除. (3认同)
  • 我想也许忽略的部分是_why_无意义的决定(在Apple的部分)不允许比较器块首先使用Core Data提取.并且_how_在Core Data提取中解决它. (2认同)

Bru*_*tti 7

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

[NSSortDescriptor sortDescriptorWithKey:(NSString *) ascending:(BOOL) selector:(SEL)]
Run Code Online (Sandbox Code Playgroud)

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

例如,我只需要对字符串“a la Finder”(即 1,2,9,10,而不是 1,10,2,9)进行排序,然后我使用了

request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:myEntity ascending:NO selector:@selector(localizedStandardCompare:)]];
Run Code Online (Sandbox Code Playgroud)

看看AppleNSSortDescriptor 类参考

快乐编码:)

  • 我的意思是选择器也不适用于核心数据。就像我们在模型上有一个 `@selector(fancyCompare:)`。它不适用于核心数据。 (2认同)
  • 挖掘这个僵尸,因为我发现评论没有帮助 - 你必须使用内置的比较器选择器之一。请参阅 http://stackoverflow.com/a/27972020/2200576。 (2认同)