ios - iOS NSManagedObjectContext.mergeChanges 冻结了主线程
问题描述
- 用作
NSFetchedResultsController
的数据源UITableView
。它是使用主上下文 (persistentContainer.viewContext
) 创建的。 - 使用后台上下文执行批量删除
- 将更改合并到主上下文以更新 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)")
}
}
在这种情况下有什么办法可以避免阻塞主线程?请帮忙。谢谢
解决方案
推荐阅读
- c++ - How to use the getline() function if I don't use "using namespace std;"?
- git - git 等效于 mercurials 阶段的功能,用于防止分支被推送
- javascript - 将中间件添加到一行/函数中的所有 firebase 函数
- node.js - 为什么在部署时会删除 Cloud Function 运行时环境变量?
- python - 有没有办法检查 DynamoDB 表中是否存在 key=value?
- azure-devops - 在不同的版块中查看相同的故事
- java - 如果字符位于行尾,Java split 方法不起作用
- swift - 从字典数据构建树的最有效方法
- javascript - 在 POST 请求后 Express 不呈现页面
- javascript - 使用嵌套承诺和等待的最佳方式是什么