Я работаю над приложением, которое обрабатывает это точное поведение в течение последних двух месяцев или около того. Он имеет небольшое подмножество функций, которые доступны только в Интернете, и большой набор функций, которые находятся в автономном режиме/онлайн.
Я использую sqlite для локального хранилища, как предлагается здесь, с модифицированной версией библиотеки sqlitepersistentobjects. Базовая версия sqlitepersistentobjects не является потокобезопасной, поэтому следите, если вы ее используете. (ознакомьтесь с objectiverecord в: objectivesync для альтернативы поточной безопасностью, но будьте готовы копаться в коде). Если вы захотите разработать для 3.0 sdk, то основные данные - это еще одна возможность для библиотеки sqlite.
Общая архитектура достаточно проста. Я смоделировал локальное хранилище с использованием sqlite и удаленного взаимодействия, используя objective resource против приложения rails и REST api. Он может использовать xml или json для сериализации данных.
Когда объект изменен локально, изменение сначала сохраняется в записи базы данных sqlite для этого объекта, а затем добавляется в очередь, которая сериализуется и хранится в локальной базе данных sqlite. (Затем очередь может быть обработана в любое время)
Если есть доступное соединение, любые локальные изменения в очереди локализуются и добавляются в NSOperationQueue, который затем обрабатывает их в фоновом режиме.
Для того, чтобы все это работало, я подклассифицировал NSOperation так, чтобы он мог поддерживать несколько типов операций с удаленной очередью - создавать, обновлять, удалять по существу с использованием объектного ресурса для выполнения удаленных запросов.
Приятная вещь в использовании NSOperationQueue и NSOperation заключается в том, что они обрабатывают фоновый поток для вас, поэтому я настоятельно рекомендую взглянуть на документы яблока для этих классов, а также на apple threading guide.
Когда приложение загружается, выполняется небольшая дистанционная проверка и обработка в фоновом режиме, чтобы вытащить последние данные - хотя, честно говоря, я все еще изменяю способ, которым это ведет немного.
Это краткий обзор того, с чем мне пришлось иметь дело до сих пор ... надеюсь, что это поможет немного.
Я второй этот вопрос, и добавить, что я хотел бы услышать о стратегиях слияния данные вне синхронизации. Обращение к серверу на синхронизацию не вызывает затруднений. Жесткая часть - это выяснить, как объединить данные сервера с локальными данными. – Alex