Мы пытаемся отлаживать проблему с несколькими контентами/потоками Core Data, в которой объединение уведомления о сохранении Core Data в наш основной поток NSManagedObjectContext
вызывает спорадическое сбой приложения. Это приводит к сбою ~ 2% от наших сеансов приложений, и мы не понимаем, как это решить. Мы были бы очень признательны за любые рекомендации или общие рекомендации о том, что может привести к этой катастрофе.
У нас есть настройка Core Data, которая выглядит так:
Нотабене Это стандартный стек Core Data в Magical Record v2.3, созданный с помощью [MagicalRecord setupAutoMigratingCoreDataStack]
Это сценарий, в котором наше приложение терпит крах:
- Запрос HTTP возвращает JSON
- JSON анализируется на
NSManagedObject
(некоторые новые сущности, некоторые обновленные объекты) в Контекст сохранения корня - Контекст сохранения корня сохраняет в постоянном хранилище
-
NSManagedObjectContextDidSaveNotification
транслируется базовыми данными. По умолчанию используется контекст в главной очереди и вызываетmergeChangesFromContextDidSaveNotification:
сNSDictionary
изменений в основном потоке. - Он вылетает, когда
objectID
отправляется на недопустимый объект (скорее всего,NSManagedObject
был освобожден).
Это происходит внутри частной реализации NSManagedObjectContext
mergeChangesFromContextDidSaveNotification:
, поэтому мы не можем видеть, что на самом деле произошло здесь неправильно; все, что мы можем сказать в этой точке, что объект, который должен существовать, не делает.
Это происходит только при небольшом проценте данных Core Data, что указывает на то, что это не может быть фундаментальным недостатком в нашем стеке Core Data → API. Более того, нет никаких указаний на то, что размер или тип изменений (вставки/обновления/удаления) в контексте изменений оказывают какое-либо влияние на вероятность сбоя.