使用带有NSBatchDeleteRequest的NSFetchedResultsController

Fre*_*ust 3 core-data nsfetchedresultscontroller ios swift nsbatchdeleterequest

我在使用NSBatchDeleteRequest后从NSFetchedResultsControllerDelegate获得准确更新时遇到问题,更改是作为更新类型而不是didChange委托方法上的删除类型.有没有办法让更改作为删除进入?(我有不同的删除与更新方案).

删除请求:(使用调用者提供的私有上下文)

fileprivate class func deletePeopleWith(ids: Set<Int>, usingContext context: NSManagedObjectContext) {

    let fr: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Person")

    var predicates: [NSPredicate] = []
    ids.forEach {

        predicates.append(NSPredicate(format: "id = %ld", $0))
    }

    fr.predicate = NSCompoundPredicate(orPredicateWithSubpredicates: predicates)

    let dr = NSBatchDeleteRequest(fetchRequest: fr)
    dr.affectedStores = context.parent?.persistentStoreCoordinator?.persistentStores

    do {

        try context.parent?.execute(dr)
        context.parent?.refreshAllObjects()
        print("Deleting person")

    } catch let error as NSError {

        let desc = "Could not delete person with batch delete request, with error: \(error.localizedDescription)"
        debugPrint(desc)
    }

}
Run Code Online (Sandbox Code Playgroud)

结果是:

func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {

    DispatchQueue.main.async {

        let changeDesc = "Have change with indexPath of: \(indexPath), new index path of: \(newIndexPath) for object: \(anObject)"
        var changeType = ""
        switch type {

        case .delete:
            changeType = "delete"

        case .insert:
            changeType = "insert"

        case .move:
            changeType = "move"

        case .update:
            changeType = "update"

        }

        print(changeDesc)
        print(changeType)
    }

}
Run Code Online (Sandbox Code Playgroud)

印刷:

Have change with indexPath of: Optional([0, 0]), new index path of: Optional([0, 0]) for object: *my core data object*
update
Run Code Online (Sandbox Code Playgroud)

bte*_*pot 7

来自Apple的文档:

批量删除比在代码中自己删除Core Data实体运行得更快,因为它们在SQL级别的持久性存储本身中运行.作为此差异的一部分,持久性存储上实现的更改不会反映在当前内存中的对象中.

执行批量删除后,删除内存中已从持久性存储中删除的所有对象.

有关处理删除的对象,请参阅" 执行后更新应用程序"部分NSBatchDeleteRequest.

  • 单独的文档不起作用,但在删除请求上将结果类型更新为对象ID,然后在获取的结果控制器使用的上下文中调用刷新所有对象,将更改作为删除进入! (3认同)
  • 该文档没有明确显示此代码,但它确实说明:“要执行此操作,首先确保在执行请求之前将 `NSBatchDeleteRequest` 的 `resultType` 设置为 `NSBatchDeleteRequestResultType.resultTypeObjectIDs`。” 所以一定要包括:`deleteRequest.resultType = .resultTypeObjectIDs`。 (3认同)