IOS - Основные рекомендации по синхронизации базы данных и базы данных сервера
Я начинаю настраивать базовую модель данных для крупномасштабного приложения и надеялся на некоторую обратную связь о правильных методах/методах синхронизации, когда речь идет о базе данных сервера и автономных возможностях.
Я использую PHP и mySQL для своего веб-сервера/базы данных.
Я уже знаю, как подключаться, получать данные, хранить данные ядра и т.д. и т.д. Я больше ищут помощь в методологиях и конкретных примерах отслеживания изменений данных:
A) Убедитесь, что приложение и сервер синхронизируются во время онлайн-и офлайн-использования (т.е. автономная активность будет активирована сразу же).
B) Оптимизируйте скорость сохранения данных в приложении.
Мои главные вопросы:
Каков наилучший способ проверить, какие новые/обновленные данные в приложении все еще нужно синхронизировать (после использования в автономном режиме)?
(т.е. во всех моих основных объектах данных я помещаю атрибут "isSynchronized" типа BOOL, а затем обновляюсь до "YES" после успешной отправки и ответ отправляется с сервера). Это лучший способ?
Каков наилучший способ оптимизации скорости хранения данных с сервера на основные данные?
(т.е. как я могу только обновлять данные в Core Data, которые старше, чем в базе данных сервера, без повторения каждой сущности и просто обновления каждый раз)? Можно ли без добавления столбца базы данных сервера отслеживать отметки времени обновления для КАЖДОЙ таблицы?
Опять же, я уже знаю, как загружать данные и хранить их в Core Data, я просто ищу какую-то помощь с лучшими практиками в обеспечении синхронизации между базами приложений и серверов, обеспечивая при этом оптимизированное время обработки.
Ответы
Ответ 1
Я сохраняю последнюю измененную метку времени в базе данных как для основных записей данных на телефоне, так и для таблиц mysql на сервере.
Телефон выполняет поиск всего, что изменилось с момента последней синхронизации, и отправляет его на сервер вместе с временной отметкой последней синхронизации, и сервер отвечает всем, что изменилось на нем с момента создания временной метки синхронизации.
Производительность - это проблема, когда много записей изменилось. Я выполняю синхронизацию на фоне NSOpeartion, у которого есть собственный контекст управляемого объекта. Когда фоновый поток завершил внесение изменений в контекст управляемого объекта, существует API для объединения всех изменений в контекст объекта с управляемым потоком, который можно настроить, чтобы просто отбросить все изменения, если есть какие-либо конфликты, вызванные пользователь меняет данные во время синхронизации. В этом случае я просто подожду несколько секунд, а затем снова попробую выполнить синхронизацию.
На более раннем оборудовании даже после многих оптимизаций было необходимо полностью прекратить синхронизацию, если пользователь начинает делать что-то в приложении. Он просто использовал слишком много системных ресурсов. Я думаю, что более современные устройства iOS, вероятно, достаточно быстры, и вам больше не нужно этого делать.
(кстати, когда я сказал, что "много записей изменилось", я имел в виду 30 000 строк, обновляемых или вставленных на телефон)