Эй, я сейчас работаю над слоем модели для нашего приложения.
Некоторые из требований выглядят следующим образом:
- Он должен работать на 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:во время сетевых запросов. - Я хочу как-то получить уведомления в пользовательском интерфейсе, что некоторая операция синхронизации пошла не так.
 - Я хочу, чтобы фактическое сохранение данных ядра не удавалось, если запросы сервера не выполнялись.
 
Любые идеи?