ios - 快速删除后台线程上的核心数据而不更新 MOC

标签 ios swift multithreading core-data

我试图了解后台线程并通过后台 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 中的最佳方法是使用 .xcmod​​eld 文件的关系检查器编辑对多关系并设置删除规则级联。

然后您删除主记录本身。 Core Data 会自动将您的删除级联到所有辅助记录。它们也将被删除,您无需执行任何其他操作。

如果您需要保留主记录并仅清除关系,则可以考虑与将保存对多辅助记录的中间实体建立一对一关系。通过这种方式,您可以删除该中间实体并为一对一关系分配一个新实体。

关于ios - 快速删除后台线程上的核心数据而不更新 MOC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63547185/

相关文章:

ios - 我是否需要使用OBJC_ASSOCIATION_RETAIN_NONATOMIC释放@dynamic变量集?

ios - 如何获取iCarousel当前可见 View ?

swift - cellTopLabel背景颜色和cornerRadius

ios - Swift - 是否可以 ping RTMP Url?

java - 方法同步线程问题

multithreading - 为 javaFX 应用程序中的多个任务调用 Platform.runLater

ios - "Restore Purchases"按钮在第二次按下时崩溃应用程序

ios - 负字符串做小数 nsnumber

multithreading - iOS4 & 背景 [UIImage setImage :]

iphone - MPMoviePlayerController 播放 YouTube 视频