使用 NSSortDescriptor、Core Data 和 NSFetchedResultsController 按日期和名称对 UITableView 进行排序

Posted

技术标签:

【中文标题】使用 NSSortDescriptor、Core Data 和 NSFetchedResultsController 按日期和名称对 UITableView 进行排序【英文标题】:Sorting a UITableView by date and name with NSSortDescriptor, Core Data and NSFetchedResultsController 【发布时间】:2014-04-11 22:51:12 【问题描述】:

我有一个当前按日期排序的 UITableViewController。我正在使用Core DataNSFetchedResultsController,我还想进一步介绍按名称排序。

我的模型是:

交易实体 与日期实体的关系 与人实体的关系

我的fetchedResultsController 代码是这样的:

- (NSFetchedResultsController *)fetchedResultsController

    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
    if (_fetchedResultsController != nil)
    
        return _fetchedResultsController;
    
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Transaction" inManagedObjectContext:managedObjectContext];
    fetchRequest.entity = entity;
    if ([self.timelineSearchBar.text length] > 0) 
        NSPredicate *predName = [NSPredicate predicateWithFormat:@"whoBy.name CONTAINS[c] %@", self.timelineSearchBar.text];
        NSPredicate *predOccasion = [NSPredicate predicateWithFormat:@"occasion.title CONTAINS[c] %@", self.timelineSearchBar.text];
        NSPredicate *predSubOccasion = [NSPredicate predicateWithFormat:@"subevent.title CONTAINS[c] %@", self.timelineSearchBar.text];
        NSPredicate *compPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[predName, predOccasion, predSubOccasion]];

        [fetchRequest setPredicate:compPredicate];
    
    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"dates.dateOfEvent" ascending:NO];


    fetchRequest.sortDescriptors = [NSArray arrayWithObject:sort];
    fetchRequest.fetchBatchSize = 20;
    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"sectionDateFormatter" cacheName:nil];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;
    return _fetchedResultsController;

所以sortDescriptor 现在正在对日期进行排序。 sectionTitles 是从 NSDate 到 NSString 的转换。

我尝试使用以下代码添加另一个sortDescriptor

NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"whoBy.name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];

fetchRequest.sortDescriptors = @[[NSArray arrayWithObjects:sort, sortByName, nil]];

应用程序因此错误而崩溃:

-[__NSArrayI key]: unrecognized selector sent to instance 0x1702237c0
 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI key]: unrecognized selector sent to instance 0x1702237c0'

我想要实现的只是确保按日期排序的条目也按名称排序。

非常感谢任何指导。

【问题讨论】:

【参考方案1】:

您正在设置排序描述符数组的数组。修正这一行:

fetchRequest.sortDescriptors = @[[NSArray arrayWithObjects:sort, sortByName, nil]];

到:

fetchRequest.sortDescriptors = @[sort, sortByName];

【讨论】:

非常感谢@thom_ek - 这真的很完美 - 很棒的收获,感谢您的帮助 - 抱歉这个基本问题!

以上是关于使用 NSSortDescriptor、Core Data 和 NSFetchedResultsController 按日期和名称对 UITableView 进行排序的主要内容,如果未能解决你的问题,请参考以下文章

Core Data NSSet 对象的 NSSortdescriptor

NSSortDescriptor 对 Core Data NSSet 对象进行排序的最有效方法

使用 NSSortDescriptor 对 NSOrderedSet 进行排序

NSSortDescriptor 错误:“[NSSortDescriptor 计数]:无法识别的选择器发送到实例”

使用两个 NSSortDescriptor 过滤数组

具有任意排序的 NSSortDescriptor