2016-01-20 2 views
0

Я работаю над приложением, которое изначально извлекает некоторые данные из бэкэнд-сервиса и хранит в sqlite приложения с использованием данных ядра. Управляемые объекты претерпевают множество изменений во время использования приложения. Вовремя данные должны быть синхронизированы с базовым сервисом.Основные данные данных синхронизируются в фоновом режиме

Я попытался использовать два контекста управляемого объекта: один для взаимодействия с пользовательским интерфейсом и один для синхронизации с бэкэнд, чтобы я мог объединить контекст. Но контекст, используемый пользовательским интерфейсом, не сохраняется в постоянном хранилище каждый раз, и поэтому, когда я выбираю, используя второй контекст, в управляемых объектах существует несоответствие.

Во-вторых, я попытался использовать родительский дочерний контекст. Родительский контекст для взаимодействия с пользовательским интерфейсом и дочернего элемента для своевременной синхронизации данных. Но когда-нибудь я вижу, что пользовательский интерфейс блокируется навсегда. Я убедился, что действия над управляемыми объектами выполняются в блоке по соответствующему контексту управляемого объекта.

Мой вопрос в том, как я могу обрабатывать новые данные, полученные от службы, и обновлять управляемый объект без блокировки пользовательского интерфейса.

+0

Ваш общий подход правильный. Проблемы, с которыми вы сталкиваетесь, связаны с некоторой ошибкой в ​​реализации. – Mundi

+0

есть. Мы анализируем это. Спасибо за ваш ответ – Jithesh

ответ

0

Here's a post that describes a few possible setups. Я подведу некоторые основные моменты и решения.

Ваша вторая попытка потерпела неудачу, потому что ваш контекст пользовательского интерфейса (родительский) все еще выполнял операции ввода-вывода в основном потоке, поэтому он блокировал.

Решение 1 - Храните ваши контексты отдельно, как вы пробовали в первую очередь.

Изменение распространения между контекстами достигается за счет подписки на NSManagedObjectContextDidSaveNotification и вызова mergeChangesFromContextDidSaveNotification: на другом контексте.

Таким образом, вы подписываетесь на уведомление из частного контекста обслуживания; а затем вызовите -mergeChanges ... в контекст пользовательского интерфейса, который синхронизирует их и очень быстро.

Решение 2 - сделать ваш контекст пользовательского интерфейса дочерним элементом третьего частного контекста очереди. Другими словами, ваш стек Persistent магазин < - частное Context < - UI (Main Queue) Контекст < - контекст Private синхронизации. Это перемещает ваш диск ввода/вывода на задний план, который должен поддерживать ваш интерфейс. Обратите внимание, однако, что теперь вам также нужно вызвать save в контексте пользовательского интерфейса и новый контекст для сохранения изменений из фона; плюс этот подход медленнее, чем решение 1

Смежные вопросы