Основные данные падает при доступе к контексту - PullRequest
0 голосов
/ 05 февраля 2020

Недавно я занялся разработкой существующего проекта 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 является контекст, который зарегистрирован для объекта. Поэтому я предполагаю, что значение изменяется, и поэтому используется неправильный контекст. Я думаю, что это вызывает проблему доступа потока.

Кто-нибудь еще сталкивался с этими проблемами, когда зарегистрированный контекст используется напрямую и как вы обходили его?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...