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