Доступ к Совместно используемым Данным от Расширения Приложения и его Содержания Приложения
Объясняют проблемы координации файла, когда используется расширением приложения получить доступ к контейнеру, совместно использованному с его содержанием приложения.
Введение
Используя координацию файла в расширении приложения для доступа к контейнеру, совместно использованному с его содержанием приложения, может привести к мертвой блокировке. Если процесс является приостановленной серединой скоординированного I/O, это обычно имеет место. Это может быть более распространено на iOS, где большинство приложений будет приостановлено после короткого периода времени, будучи перемещенным в фон. Расширения должны использовать альтернативы координации файла.
Вместо этого используйте CFPreferences, атомарные безопасные операции сохранения на плоских файлах, SQLite или Базовых Данных.
Координация файла и совместно используемые контейнеры
Координация файла не имеет механизма для обработки приостановок процесса. На iOS процессы могут быть приостановлены как часть выброшенного за борт груза и управления процессами. На OS X это только происходит в отладчике. Рекомендуемая практика на iOS 7, и для приложений в целом, должна обработать уведомления UIApplication, что приложение было backgrounded, и отмена скоординировала действия, и удалите предъявителей файла. Когда приложение возвращено переднему плану, предъявители файла могут быть повторно добавлены. Расширения не получают уведомления фоновой обработки UIApplication и не могут сделать этого. Расширения также не могут взять дополнительные утверждения фоновой задачи, таким образом, они не могут избежать приостанавливаться как приложения.
Решения
Можно использовать CFPreferences, атомарные безопасные операции сохранения на плоских файлах, или SQLite или Базовые Данные для совместного использования данных в контейнере группы между многократными процессами, даже если Вы - приостановленная середина транзакции. Для Данных SQLite/Core базы данных использования процессов в режиме журнала DELETE будут немедленно уничтожены вместо приостановленного. База данных использования процессов в режиме журнала WAL только будет jetsam'd, если они попытаются содержать транзакцию записи, открытую во время приостановки. Блокировки файла Posix также работают, и ведут себя так же к базе данных SQLite в режиме журнала DELETE, поэтому открывают (O_EXLOCK), или скопление () могло также использоваться.
Независимо от этой проблемы содержание приложения (и все приложения) должно должным образом использовать утверждения фоновой задачи вокруг операций файла, которых они требуют завершенный в совместно используемом контейнере (с или без расширений). Это включает все записи или удаления. Такой процесс мог бы все еще быть уничтожен выброшенным за борт грузом, но при большой нижней частоте.
История версии документа
| Дата | Примечания |
|---|---|
| 10.09.2014 | Новый документ, объясняющий проблемы координации файла, когда используется расширением приложения получить доступ к контейнеру, совместно использованному с его содержанием приложения. |