Недавно я занялся разработкой существующего проекта iOS на основе Core Data. В проекте используется фоновый syn c для извлечения и обновления данных с сервера и записи их в Core Data. Однако в некоторых случаях это приводит к cra * sh в следующем блоке:
context.perform {
print("Replacing \(type) \(serverId)")
var modifiedObject = modifiedObject
modifiedObject.serverId = serverId
modifiedObject.modified = false
do {
try context.save()
}
catch {
print(error)
print("could not save context")
}
fulfill(())
}
Контекст вышеупомянутого блока ранее был создан в фоновом контексте:
let context = self.persistentContainer.newBackgroundContext()
context.mergePolicy = NSMergePolicy(merge:
NSMergePolicyType.mergeByPropertyStoreTrumpMergePolicyType)
context.stalenessInterval = 0
Приложение не выдает ошибку в блоке catch, но перестает работать при доступе к контексту. Дальнейшие подробности журнала не найдены.
В большинстве примеров базовых данных, которые я видел, используется persistentContainer.viewContext
или newBackgroundContext()
для фоновых операций. В этом приложении в основном потоке приложение по умолчанию использует контекст, зарегистрированный для самого объекта. См. Следующий пример:
self.fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: location.managedObjectContext!, sectionNameKeyPath: nil, cacheName: nil)
Значением свойства managedObjectContext
является контекст, который зарегистрирован для объекта. Поэтому я предполагаю, что значение изменяется, и поэтому используется неправильный контекст. Я думаю, что это вызывает проблему доступа потока.
Кто-нибудь еще сталкивался с этими проблемами, когда зарегистрированный контекст используется напрямую и как вы обходили его?