fetchResultController 快速获取 NSInvalidArgumentException

Posted

技术标签:

【中文标题】fetchResultController 快速获取 NSInvalidArgumentException【英文标题】:fetchResultController get NSInvalidArgumentException swift 【发布时间】:2018-06-13 04:41:01 【问题描述】:

基本上我想获取该实体中的所有对象 我在 viewDidLoad() 中调用这个方法

func updateUI() 
    if let context = container?.viewContext 
        let request:NSFetchRequest<Reminder> = Reminder.fetchRequest()
        request.sortDescriptors = [NSSortDescriptor(key: title, ascending: true)]
        fetchResultController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
        try? fetchResultController?.performFetch()
        remindersCollectionViewController.reloadData()
    

标题是字符串?实体名称为“提醒” 目前 coredata 中没有对象

当执行这行代码时

fetchResultController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)

应用程序崩溃,我收到了错误

2018-06-13 12:14:25.345072+0800 Reminders[25712:3061130] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'

感谢任何帮助

【问题讨论】:

【参考方案1】:

这里看起来很奇怪的是title 是一个字符串?在您的排序描述符中。在大多数用例中,排序描述符是固定的,所以你应该这样做(假设 Reminder 有一个属性 title

request.sortDescriptors = [NSSortDescriptor(key: "title", ascending: true)]

或者更好的是,使用#keyPath

request.sortDescriptors = [NSSortDescriptor(key: #keyPath(Reminder.title), ascending: true)]

如果我错了,并且 title 是一个可以在两次提取之间更改的变量,那么至少在使用之前解开它

if let sortKey = title 
     request.sortDescriptors...

【讨论】:

有点尴尬...原来只是忘了加引号...非常感谢

以上是关于fetchResultController 快速获取 NSInvalidArgumentException的主要内容,如果未能解决你的问题,请参考以下文章

对 fetchResultController 如何与 MagicalRecord 一起工作感到困惑

有时无法访问从 fetchResultController 返回的 NSmanagedObject

TableView NSFetchedResultsController CoreData:错误

云原生数据中台“智领云”获数千万元A 轮融资!

简单易用性价比高:“连影”反向代理软件获行业青睐

5月14日 日报:苹果强势入局云计算/瑞幸咖啡仍在快速开店/全球首个远程超声机器人获批/索尼开发出首颗AI图像传感器