【发布时间】:2020-12-12 06:37:31
【问题描述】:
我试图了解后台线程并通过后台 MOC 操作 CoreData,但在从 CoreData 删除大量记录时遇到了一些障碍
我的设置是,我有许多(主要)记录,每个记录可以通过一对多关系关联到 0 到几千个(次要)记录
这由主/细节样式设置中的 2 个视图控制器表示。
ViewController A 有一个表格视图,列出了所有的主要记录。 然后,当点击 viewController A 上的单元格时,ViewController B 会显示相关记录
两个表都在主线程上填充,并使用 persistentContainer.viewContext 获取数据。
ViewController B 为用户提供了批量删除所有关联记录的选项,因此我希望在后台线程上完成此操作,以免阻塞主线程。
我遇到的问题是,如果我在处理完成之前删除记录并关闭 viewController B,它不会删除记录。 但是,如果我让 viewController B 打开直到删除完成,它会很好地删除它们。
我注意到的一件事是,如果我在删除线程完成之前关闭 ViewController B,则视图在后台删除过程结束之前不会取消初始化,因此在视图关闭后它似乎仍在删除,但是它似乎不会保存到持久存储中,除非我在进程完成之前让视图保持打开状态
这是我用来删除后台记录的代码:
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 时如何使数据保持不变?
提前致谢
【问题讨论】:
标签: ios swift multithreading core-data