CoreData删除后列表刷新



我有一个从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时需要注意的一些重要事项是:

  1. NSBatchDeleteRequest直接修改NSPersistentStore,不需要在内存中加载任何数据。
  2. 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]
)

最新更新