Эй, я сейчас работаю над слоем модели для нашего приложения.
Некоторые из требований выглядят следующим образом:
- Он должен работать на iPhone OS 3.0 +.
- Источником наших данных является RESTful Rails-приложение.
- Мы должны кэшировать данные локально с помощью Core Data.
- Клиентский код (наши контроллеры пользовательского интерфейса) должен иметь как можно меньше знаний о любых сетевых возможностях и должен запрашивать/обновлять модель с помощью API данных ядра.
Я проверил сеанс 117 WWDC10 по созданию пользовательского опыта, управляемого сервером, потратил некоторое время на проверку Objective Resource, Core Resource и RestfulCoreData.
Рамка Objective Resource не относится к основным данным сама по себе и представляет собой просто реализацию клиента REST. Core Resource и RestfulCoreData все предполагают, что вы говорите с Core Data в своем коде, и они решают все гайки и болты в фоновом режиме на уровне модели.
Все выглядит нормально до сих пор, и изначально я, хотя либо Core Resource, либо RestfulCoreData будет охватывать все вышеперечисленные требования, но... Есть пара вещей, которые ни один из них, похоже, не может решить правильно:
- Основной поток не должен блокироваться при сохранении локальных обновлений на сервере.
- Если операция сохранения не удалась, ошибка должна быть распространена в пользовательском интерфейсе, и никакие изменения не должны быть сохранены в локальном хранилище основных данных.
Основной ресурс выполняет выдачу всех своих запросов на сервер при вызове - (BOOL)save:(NSError **)error
в Контексте управляемого объекта и, следовательно, может каким-то образом предоставить правильный экземпляр NSError базовых запросов на сервер. Но он блокирует вызывающий поток, пока операция сохранения не завершится. СБОЙ.
RestfulCoreData сохраняет ваши сообщения -save:
неповрежденными и не представляет дополнительного времени ожидания для клиентского потока. Он просто наблюдает за NSManagedObjectContextDidSaveNotification
, а затем выдает соответствующие запросы на сервер в обработчике уведомлений. Но таким образом вызов -save:
всегда завершается успешно (ну, учитывая, что Core Data в порядке с сохраненными изменениями), и код клиента, который на самом деле вызвал его, не имеет никакого способа узнать, что сохранение может не распространяться на сервер из-за некоторых 404
или 421
или произошла какая-либо ошибка на стороне сервера. И даже больше, локальное хранилище становится для обновления данных, но сервер никогда не знает об изменениях. СБОЙ.
Итак, я ищу возможное решение/общие практики для решения всех этих проблем:
- Я не хочу, чтобы вызывающий поток блокировал каждый вызов
-save:
во время сетевых запросов. - Я хочу как-то получить уведомления в пользовательском интерфейсе, что некоторая операция синхронизации пошла не так.
- Я хочу, чтобы фактическое сохранение данных ядра не удавалось, если запросы сервера не выполнялись.
Любые идеи?