我试图了解后台线程并通过后台 MOC 操作 CoreData,但在从 CoreData 删除大量记录时遇到了一些障碍
我的设置是,我有许多(主)记录,每个记录可以有 0 到数千条(辅助)记录,通过一对多关系与其关联
这由主/详细样式设置中的 2 个 View Controller 表示。
ViewController A 有一个 TableView ,列出了所有主要记录。 然后,当点击 viewController A 上的单元格时,ViewController B 会显示关联的记录
两个表都在主线程上填充,并使用 permanentContainer.viewContext 获取数据。
ViewController B 为用户提供了批量删除所有关联记录的选项,因此我希望在后台线程上完成此操作,以免阻塞主线程。
我遇到的问题是,如果我在进程完成之前删除记录并关闭 viewController B,它不会删除记录。 但是,如果我让 viewController B 打开直到删除完成,它就可以很好地删除它们。
我注意到的一件事是,如果我在删除线程完成之前关闭 ViewController B,则 View 在后台删除过程结束之前不会取消初始化,因此在 View 关闭后它似乎仍在删除,但是除非我将 View 保持打开状态直到该过程完成,否则它似乎不会保存到持久存储中
这是我用来删除后台记录的代码:
class GlobalChanges....
static func deleteRecords(records: [NSManagedObject], managedContext: NSManagedObjectContext, finished: () -> Void){
//create a new background MOC
let coreDataManager = CoreDataStack.shared
let backgroundContext = coreDataManager.persistentContainer.newBackgroundContext()
backgroundContext.automaticallyMergesChangesFromParent = true
backgroundContext.performAndWait {
//remove the records from the managed context
for record in records{
let backgroundContextRecord = backgroundContext.object(with: record.objectID) as NSManagedObject
//delete the record
backgroundContext.delete(backgroundContextRecord)
}
do {
//update core data
try backgroundContext.save()
managedContext.refreshAllObjects()
finished()
} catch let error as NSError {
print("Could not save \(error), \(error.userInfo)")
}
}
}
当用户点击删除时,将调用此方法:
@IBAction func deleteButton(_ sender: UIButton) {
let deleteQueue = DispatchQueue(label: "deleteQueue")
deleteQueue.async {
GlobalChanges.deleteRecords(records: self.selectedRows, managedContext: self.managedContext){
DispatchQueue.main.async{
//update UI...
}
}
}
}
在删除过程完成之前关闭 ViewController B 时,如何使数据保持不变?
提前致谢
最佳答案
我想对您的问题做出的贡献并不是解决您的问题本身。但我想帮助您改进“批量删除所有关联记录”的方法。
如果您确实想一次删除主(主)记录的所有辅助记录,CoreData 中的最佳方法是使用 .xcmodeld 文件的关系检查器编辑对多关系并设置删除规则级联。
然后您删除主记录本身。 Core Data 会自动将您的删除级联到所有辅助记录。它们也将被删除,您无需执行任何其他操作。
如果您需要保留主记录并仅清除关系,则可以考虑与将保存对多辅助记录的中间实体建立一对一关系。通过这种方式,您可以删除该中间实体并为一对一关系分配一个新实体。
关于ios - 快速删除后台线程上的核心数据而不更新 MOC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63547185/