Фоновая история
Я занимаюсь разработкой большого приложения для iOS. Это приложение работает при определенных допущениях. Основным из них является то, что приложение должно работать автономно с внутренним хранилищем, которое является снимком последнего синхронизированного состояния данных, сохраненных на сервере. Я решил использовать CoreData для обработки этого хранилища. Каждый раз, когда приложение запускается, я проверяю, включено ли соединение WiFi, и затем пытаюсь синхронизировать хранилище с сервером. Синхронизация может занять около 3 минут из-за размера данных.
Процесс синхронизации состоит из нескольких этапов, и на каждом из них I:
- получить некоторые данные с сервера (XML)
- десериализовать его
- сохранить в Core Data
Задача
Процесс синхронизации может быть прерван по нескольким причинам (подключение к Интернету, отключение сервера, выход пользователя из приложения и т. Д.). Это может привести к несинхронизации данных.
Предположим, что процесс синхронизации состоит из 5 этапов и прерывается после третьего. Это приводит к тому, что 3/5 данных обновляются во внутреннем хранилище, а остальные не синхронизированы. Я не могу этого допустить, потому что данные тесно связаны друг с другом (бизнес-логика).
Цель
Я не знаю, возможно ли это, но я думаю о реализации одного решения. При запуске процесса синхронизации я хотел бы создать моментальный снимок (своего рода копию) текущего состояния Core Date и в процессе работы с ним над ним. Когда процесс синхронизации завершается успешно, этот снимок может перезаписать текущее состояние CoreData. Когда синхронизация прерывается, снимок может быть просто отменен. Мое внутреннее хранилище будет защищено.
Вопросы
- Как создать снимок CoreData?
- Как работать со снимком CoreData?
- Как перезаписать состояние CoreDate со снимком?
Спасибо в совете за любую помощь. Примеры кода, если это возможно, будут оценены.
РЕДАКТИРОВАТЬ 1
Размер данных слишком велик, чтобы обрабатывать его в нескольких контекстах CoreData. Во время синхронизации я несколько раз сохраняю текущий контекст для очистки памяти. Если я этого не сделаю, приложение завершится с ошибкой памяти.
Я думаю, что это должно быть разрешено несколькими NSPersistentStoreCoordinator
с использованием, например, этого метода: link . К сожалению, я не знаю, как это реализовать.