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)
来自Apple的文档:
批量删除比在代码中自己删除Core Data实体运行得更快,因为它们在SQL级别的持久性存储本身中运行.作为此差异的一部分,持久性存储上实现的更改不会反映在当前内存中的对象中.
执行批量删除后,删除内存中已从持久性存储中删除的所有对象.
有关处理删除的对象,请参阅" 执行后更新应用程序"部分NSBatchDeleteRequest.