Сценарий:
Я использую IOS, используя запись Magical, настроенную для работы с базой данных SQLite. По умолчанию MR настраивает coredata для сериализации всех записей обратно в родительский контекст в основном потоке.
Шаблон, который я использую, заключается в том, что когда я не в основном потоке, я создаю отдельный NSManagedObjectContext для операций с основными данными, используя что-то вроде MagicalRecord:MR_saveWithBlockAndWait. Волшебная запись создает контекст, подключает его к родительскому контексту, выполняет любые операции, которые вы указываете в блоке обратного вызова, и, наконец, сохраняет. Важно отметить, что сохранение должно быть зафиксировано до завершения операции.
Когда я заканчиваю работу с фоновым потоком, я обычно уведомляю пользовательский интерфейс о том, что что-то произошло; например: что-то загружается/загружается/изменяется.
Затем в потоке пользовательского интерфейса я создаю новый запрос на выборку, используя контекст по умолчанию в основном потоке. Проблема в том, что иногда coredata не находит новый объект, который я только что зафиксировал ранее. Проблема проявляется в сложных условиях гонки, когда, если поток пользовательского интерфейса немного замедляется из-за анимации или чего-то еще, все работает нормально, но иногда он не находит новый объект.
Из того, что я прочитал, запросы на выборку всегда должны отправляться на диск. В MOC также есть свойство устаревания, но похоже, что оно касается только кеша и игнорируется, если вы выполняете запрос на выборку.
Кто-нибудь сталкивался с подобными проблемами и имеет какие-либо идеи? Благодарю.