首页 > 解决方案 > iOS NSManagedObjectContext.mergeChanges 冻结了主线程

问题描述

  1. 用作NSFetchedResultsController的数据源UITableView。它是使用主上下文 ( persistentContainer.viewContext) 创建的。
  2. 使用后台上下文执行批量删除
  3. 将更改合并到主上下文以更新 UI。(这是问题所在。它冻结了主线程)。

以下是代码:

let mainContext = persistentContainer.viewContext
let taskContext = persistentContainer.newBackgroundContext()
taskContext.perform {            
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "MyItem")
    fetchRequest.includesPropertyValues = false
    let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
    batchDeleteRequest.resultType = .resultTypeObjectIDs
    do {
        let result = try taskContext.execute(batchDeleteRequest) as? NSBatchDeleteResult
        let objectIDArray = result?.result as? [NSManagedObjectID]
        let changes = [NSDeletedObjectsKey : objectIDArray]

        /****below line of codes is the problem, it blocks main thread****/ 
        NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes as [AnyHashable : Any], into: [mainContext])

    } catch {
        print("Error batch delete items: \(error.localizedDescription)")
    }
}

在这种情况下有什么办法可以避免阻塞主线程?请帮忙。谢谢

标签: ioscore-data

解决方案


推荐阅读