实例化 NSFetchedResultsController 以未捕获的异常终止

Posted

技术标签:

【中文标题】实例化 NSFetchedResultsController 以未捕获的异常终止【英文标题】:Instantiating NSFetchedResultsController terminating with uncaught exception 【发布时间】:2017-02-02 12:14:01 【问题描述】:

我正在使用抽象类的 fetchRequest 实例化 NSFetchedResultsController

private func setupFetchController() 
    let fetchRequest : NSFetchRequest<NSFetchRequestResult> = SearchEntity.fetchRequest()
    let fetchController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
    self.fetchController = fetchController

SearchEntityPersonGroup 的抽象父类。我用它来获取 2 个带有 1 个NSFetchedResultsController 的实体。但是,调用此函数时应用程序崩溃:

libc++abi.dylib:以 NSException 类型的未捕获异常终止

我已将范围缩小到取消注释和评论 NSFetchedResultsController 的创建。我还有两个功能完全相同的功能。

我在做什么/出了什么问题?

编辑:添加到此。我可以通过使用context.performFetch(...) 手动获取SearchEntity,这给了我正确的结果。然而,因此得名,我要搜索它,所以我需要能够有效地更新。

编辑2:

其他地方正在运行的相同功能示例:

private func setupFetchController() 
    let fetchRequest : NSFetchRequest<NSFetchRequestResult> = Person.fetchRequest()

    // Sort Persons
    let sortDescriptor = NSSortDescriptor(key: "firstName", ascending: true)
    let sortDescriptor2 = NSSortDescriptor(key: "lastName", ascending: true)
    fetchRequest.sortDescriptors = [sortDescriptor, sortDescriptor2]

    // Filter Persons (only iType = 1)
    let predicate = NSPredicate(format: "iType == %i", 1)
    fetchRequest.predicate = predicate

    // Create the FetchController
    let fetchController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: "sectionName", cacheName: nil)
    self.fetchController = fetchController

【问题讨论】:

您说:“我还有 2 个这样的功能,它们的工作风格完全相同。”您是什么意思?并且这两个功能是同一类型?我的意思是它们是 FRC 函数? 我会将它们添加到 OP,它们也在实例化 FetchResultsController 但具有不同的实体。 唯一的区别是不添加 sortDescriptors / predicates 他们按预期工作? 设置异常断点。您将得到原因和明确的错误消息:NSFetchedResultsController 的实例需要带有排序描述符的获取请求 【参考方案1】:

您得到异常是因为至少需要一个排序描述符。

来自documentation:

您通常会创建一个 NSFetchedResultsController 的实例作为 表视图控制器的实例变量。当你初始化 获取结果控制器,您提供四个参数:

1) 获取请求。 这必须包含至少一个排序描述符 排序结果

2) 托管对象上下文。控制器使用此上下文执行 获取请求。

3) 可选地,返回部分的结果对象上的键路径 姓名。控制器使用关键路径将结果拆分为 部分(传递 nil 表示控制器应该生成一个 单节)。

4) (可选)控制器应使用的缓存文件的名称 (通过nil 防止缓存)。使用缓存可以避免开销 计算节和索引信息。

【讨论】:

以上是关于实例化 NSFetchedResultsController 以未捕获的异常终止的主要内容,如果未能解决你的问题,请参考以下文章

(JAVA)啥是实例化如何实现类的实例化(用类或方法创建一个该类的实例)?

C#怎么实例化对象?具体是实例化啥?

c#为啥实例化对象?啥情况下实例化对象?

c#中接口可不可以被实例化?

c++实例化一个对象

C++ 中,类的实例化对象是指啥?如果确保它的实例化对象只得一个?