- Используйте
NSFetchedResultsController
в качестве источника данных для UITableView
. Он создается с основным контекстом (persistentContainer.viewContext
). - Выполнение пакетного удаления с использованием фонового контекста
- Объединение изменений в главном контексте для обновления пользовательского интерфейса. ( В этом проблема. Замораживает основной поток ).
Вот коды:
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)")
}
}
Есть ли способ избежать блокировать основной поток в этой ситуации? Пожалуйста помоги. Спасибо