В своем приложении я использую только основной контекст Core Data. Я знаю, что в основном контексте можно запускать только основной поток. Однако, когда я обновляю основной контекст из фонового потока, я не сталкиваюсь с каким-либо сбоем.
//Cloudkit operation
let zoneOperation = CKFetchRecordZoneChangesOperation(recordZoneIDs: zonesIDs, optionsByRecordZoneID: [zonesIDs[0]: options])
zoneOperation.recordChangedBlock = { (record) in
// This is background thread
print("Record has changed")
let date = record["date"] as! Date
//Fetching Managed Object Context from Coredata (Main Context)
if let migraine = migraine(OnDate: date, inContext: self.persistentContainer.viewContext) {
migraine.date = date
saveData(inContext: self.persistentContainer.viewContext)
}
}
Как я могу выполнить сохранение основного контекста Coredata внутри фонового потока без сбоев?
Спасибо за ответ. Значит ли это, что я могу вызывать или запускать основной контекст Core Data (viewContext) из фонового потока?
Не могли бы вы хотя бы сделать отступ в своем коде
все дело в несоответствии, пока его нет, не важно основной или бг поток. основной поток - это поток, но с высоким приоритетом. Название потока пользовательского интерфейса ничего не меняет.





Используйте perform(_:) или performAndWait(_:), чтобы убедиться, что изменения контекста происходят в потоке, которому этот контекст принадлежит.
persistentContainer.viewContext.performAndWait {
self.saveData(inContext: persistentContainer.viewContext)
}
Вы также можете сделать что-то подобное с
persistentContainer.performBackgroundTask { context in
// Do stuff on this context and arrange for the changes
// to be merged back to the view context.
}
Создайте тупиковую ситуацию, тогда вы увидите, как она умирает, и поверьте мне, это произойдет в вашем производственном коде, когда у вас есть несколько запросов к основным данным. Во время тестирования вы просто создаете один поток и один запрос