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

Emp*_*ess 2 core-data nsfetchedresultscontroller swift

我正在NSFetchedResultsController用抽象类的fetchRequest 实例化一个:

private func setupFetchController() {
    let fetchRequest : NSFetchRequest<NSFetchRequestResult> = SearchEntity.fetchRequest()
    let fetchController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
    self.fetchController = fetchController
}
Run Code Online (Sandbox Code Playgroud)

SearchEntity是一个抽象父类的PersonGroup。我用它能够获取1的2个实体NSFetchedResultsController。但是,调用此函数时,应用程序崩溃:

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

我将其范围缩小到取消评论和评论的创建NSFetchedResultsController。我还有另外2个功能完全相同的样式。

我在做什么/错了吗?

编辑:添加到此。我可以手动取得SearchEntity只要使用context.performFetch(...)这给了我正确的结果。但是,因此,要搜索名称,所以我需要能够高效更新。

编辑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
}
Run Code Online (Sandbox Code Playgroud)

vad*_*ian 5

之所以会出现异常,是因为至少需要一个排序描述符。

文档中

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

1)提取请求。它必须至少包含一个排序描述符才能对结果进行排序

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

3)(可选)返回结果部分名称的结果对象上的键路径。控制器使用键路径将结果分成多个部分(传递nil表示控制器应生成单个部分)。

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