Гей, я працюю над шаром моделі для нашого додатка тут.
Деякі вимоги такі:
- Це повинно працювати на iPhone OS 3.0+.
- Джерелом наших даних є програма RESTful Rails.
- Ми повинні кешувати дані локально, використовуючи Core Data.
- Клієнтський код (наші контролери інтерфейсу користувача) повинен мати якомога менше знань про будь-які мережеві речі та запитувати / оновлювати модель за допомогою API основних даних.
Я перевірив сесію 117 WWDC10 щодо створення серверного користувацького досвіду, витратив деякий час, перевіряючи фреймворки Objective Resource , Core Resource та RestfulCoreData .
Фреймворк Objective Resource не розмовляє з Core Data самостійно, а є лише реалізацією клієнта REST. Усі основні ресурси та RestfulCoreData припускають, що ви розмовляєте з основними даними у своєму коді, і вони вирішують усі гайки та болти у фоновому режимі на рівні моделі.
Поки що все виглядає нормально, і спочатку я хоч або Core Resource, або RestfulCoreData покриватиме всі вищезазначені вимоги, але ... Є кілька речей, які, здавалося б, жодна з них не вирішує правильно:
- Основний потік не слід блокувати, зберігаючи локальні оновлення на сервері.
- Якщо операція збереження не вдається, помилку слід поширити в інтерфейс користувача, а жодні зміни не слід зберігати в локальному сховищі основних даних.
Основний ресурс видає всі свої запити на сервер, коли ви викликаєте - (BOOL)save:(NSError **)error
ваш контекст керованого об’єкта, і тому може забезпечити правильний екземпляр NSError базових запитів на сервер якимось чином не вдається. Але він блокує викличний потік, поки операція збереження не закінчиться. ПОМИЛКА.
RestfulCoreData зберігає ваші -save:
дзвінки недоторканими і не вводить жодного додаткового часу очікування для потоку клієнта. Він просто стежить за, NSManagedObjectContextDidSaveNotification
а потім видає відповідні запити на сервер в обробнику сповіщень. Але цей спосіб , -save:
виклик завжди завершується успішно (добре, враховуючи основних даних в порядку зі збереженими змінами) та клієнтський код , який на самому справі називається це не має ніякого способу , щоб знати , крім , можливо, не вдалося поширити на сервер з - за який - то 404
або 421
або що - то сталася помилка на стороні сервера. І навіть більше, локальне сховище стає для оновлення даних, але сервер ніколи не знає про зміни. ПОМИЛКА.
Отже, я шукаю можливе рішення / загальну практику вирішення всіх цих проблем:
- Я не хочу, щоб потік виклику блокувався під час кожного
-save:
дзвінка, поки трапляються мережеві запити. - Я хочу якось отримувати сповіщення в інтерфейсі про те, що якась операція синхронізації пішла не так.
- Я хочу, щоб фактичне збереження основних даних також не вдалося, якщо запити сервера не вдаються.
Будь-які ідеї?