Foundation._GenericObjCError.NilError 从核心数据批量删除

Kap*_*isa 5 core-data swift ios9 batch-delete

我正在尝试使用核心数据的批量删除功能。我有一个名为 Car 的实体。该实体的列名 modelNumber 为Int。我想删除所有型号早于 2000 的汽车。这是我的代码:

func deleteCarsOlderThan(modelNumber: Int) {
    let predicate = NSPredicate(format: "modelNumber <= %@", NSNumber(int: modelNumber))

    let fetchRequest = NSFetchRequest(entityName: "Car")
    fetchRequest.predicate = predicate

    let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
    deleteRequest.resultType = .ResultTypeCount
    do {
        let result = try self.fhirManagedObjectContext.executeRequest(deleteRequest)
        try self.fhirManagedObjectContext.save()
    }
    catch {
        print(error)
    }
}
Run Code Online (Sandbox Code Playgroud)

执行此代码时,控制转到 catch 块,并给出错误消息:Foundation._GenericObjCError.NilError。我的提取请求运行良好,就像我使用:

    let olderCars = self.executeFetchRequest(fetchRequest)
Run Code Online (Sandbox Code Playgroud)

它返回给我一系列旧车。我不知道我哪里做错了。为此,我正在使用 iOS9。

Chr*_*ers 4

TL;DR:虽然self.fhirManagedObjectContext是非可选的,但它可能从 Objective-C 返回 nil。

您观察到的错误是由 Swift 的 Foundation 桥接运行时生成的。(请参阅此处的源代码。)当带有错误指针的 Objective-C 方法返回失败值(NOnil),但没有通过指针传回实际错误时,就会发生这种情况NSError。这可能是 Core Data 中的错误造成的,或者更可能是由于使用 Objective-C 方法分派时的 nil 托管对象上下文导致该方法看起来返回NO