Совместное использование стека основных данных и данных между приложением и расширением в iOS8

Я создал framework для обмена объектами данных между приложением и расширением. Это включает в себя модель данных и файл sqlite с моим Core Data db.

Меня беспокоит, что может произойти, если и приложение, и расширение попытаются получить доступ к этой общей базе данных sqlite.

Что может пойти не так, если приложение вносит некоторые изменения в базу данных в фоновом режиме, пока расширение использует ее?

Какова наилучшая практика в этом случае?


person cfischer    schedule 17.11.2014    source источник
comment
Это Часто задаваемые вопросы.   -  person CL.    schedule 17.11.2014


Ответы (1)


Как отмечает @CL, с SQLite все в порядке. Но вы не используете SQLite напрямую, поэтому вам может потребоваться выполнить некоторую работу на уровне основных данных для обеспечения согласованности. С приложением iOS и расширением у вас есть два отдельных процесса, которые могут вносить изменения в данные. Ваш код должен учитывать это.

Если ваше расширение приложения отображает только данные (например, расширение «сегодня», которое отображает только данные, созданные в приложении), вам, вероятно, не нужно делать ничего особенного. Если ваше приложение работает в фоновом режиме и создает новые данные, когда расширение отображается, возможно, данные расширения немного устарели. Если это важно, вы можете обновить его. Но сегодня расширения обычно не видны очень долго, так что это, вероятно, не стоит. В этом случае я бы использовал NSReadOnlyPersistentStoreOption при настройке стека основных данных расширения, просто чтобы прояснить намерение и предотвратить непреднамеренные изменения.

Если ваше расширение приложения создает новые данные или изменяет существующие, ваше приложение должно знать об этом и реагировать соответствующим образом. Какие изменения вы будете вносить, будет зависеть от того, как именно расширение обрабатывает общие данные. Для измененных данных вашему приложению, вероятно, потребуется вызвать refreshObject:mergeChanges: для любых управляемых объектов в памяти с NO в качестве второго аргумента. Также, возможно, потребуется повторить любые выборки, если изменения могут повлиять на предикат поиска. Это гарантирует, что вы будете получать самые последние обновления. Для новых данных вам потребуется повторно получить любые данные, с которыми работает приложение, чтобы получить новые добавления/удаления. Хорошее время для проверки — когда приложение выходит на передний план (т. е. когда публикуется UIApplicationWillEnterForegroundNotification).

person Tom Harrington    schedule 17.11.2014
comment
Не могли бы вы посмотреть на этот вопрос? Я думаю, вы знаете ответ: stackoverflow.com/questions/41493510/ - person Bartłomiej Semańczyk; 13.02.2017