我有一个从CoreData实体记录列表的视图,有以下FetchRequest声明在视图
@FetchRequest(entity: Locations.entity(), sortDescriptors: [NSSortDescriptor(key: "locTimestamp", ascending: false)])
var locations: FetchedResults<Locations>
我有两个用于删除的函数,一个用于删除具有给定ID的一条记录
func deleteLocation(forID id: UUID) {
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Locations")
request.predicate = NSPredicate(format: "locID == %@", id as CVarArg)
do {
let location = try myContext.fetch(request) as! [NSManagedObject]
myContext.delete(location.first!)
try myContext.save()
} catch let error {
errTitle = "Error"
errMessage = error.localizedDescription
isError = true
}
}
的工作很好,所以列表与记录在视图刷新第二个用于删除所有记录
func deleteAllLocations() {
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Locations")
let deleteRequest = NSBatchDeleteRequest(fetchRequest: request)
do {
try myContext.execute(deleteRequest)
try myContext.save()
} catch let error {
errTitle = "Error"
errMessage = error.localizedDescription
isError = true
}
}
被执行(从CoreData实体中删除记录),但View中的List行不刷新。这里的问题是什么呢?
一些谷歌显示批量删除需要一些更多的步骤来工作(信息从这里)
…
使用NSBatchDeleteRequest
时需要注意的一些重要事项是:
NSBatchDeleteRequest
直接修改NSPersistentStore
,不需要在内存中加载任何数据。NSBatchDeleteRequest
不修改NSManagedObjectContext
。如果需要通知NSManagedObjectContext
批量删除,可以使用示例中的mergeChanges(fromRemoteContextSave:, into:)
。
// Specify a batch to delete with a fetch request
let fetchRequest: NSFetchRequest<NSFetchRequestResult>
fetchRequest = NSFetchRequest(entityName: "Business")
// Create a batch delete request for the
// fetch request
let deleteRequest = NSBatchDeleteRequest(
fetchRequest: fetchRequest
)
// Specify the result of the NSBatchDeleteRequest
// should be the NSManagedObject IDs for the
// deleted objects
deleteRequest.resultType = .resultTypeObjectIDs
// Get a reference to a managed object context
let context = persistentContainer.viewContext
// Perform the batch delete
let batchDelete = try context.execute(deleteRequest)
as? NSBatchDeleteResult
guard let deleteResult = batchDelete?.result
as? [NSManagedObjectID]
else { return }
let deletedObjects: [AnyHashable: Any] = [
NSDeletedObjectsKey: deleteResult
]
// Merge the delete changes into the managed
// object context
NSManagedObjectContext.mergeChanges(
fromRemoteContextSave: deletedObjects,
into: [context]
)