Естественно, это зависит от вашего приложения, но вот мои два цента:
Хранение всей вашей информации в общем каталоге является полным излишеством и не похоже на то, что оно исходит из каких-либо разумных рассуждений. Если вы чувствуете, что вашему виджету нужна вся информация, необходимая вашему приложению, возможно, вам следует пересмотреть сложность своего виджета.
Этим вы добиваетесь удобства (будущие головные боли), а не простоты (скрывая сложность за исключительной ответственностью). Предостережение заключается в том, что по мере роста и усложнения вашего приложения вы в конечном итоге будете тратить гораздо больше времени на передачу информации внутри контейнера приложения (а-ля массовый контроллер просмотра). То, к чему вы хотите стремиться, — это исключительная ответственность. Вместо этого теперь вам нужен объект для облегчения размещения информации двух приложений в одном контейнере.
Общие контейнеры также отличаются от песочницы приложения, поскольку вам нужно беспокоиться о координации операций чтения и записи. Вот почему, как правило, лучше всего использовать Core Data или NSUserDefaults (экземпляр с именем пакета). Если ваше приложение хранит изображения и другой контент, вас ждет мир боли. Даже Apple рекомендует пользовательские настройки по умолчанию (поскольку это единственный пример, который они приводят) или CoreData:
После того, как вы включите группы приложений, расширение приложения и содержащее его приложение могут использовать API NSUserDefaults для совместного доступа к пользовательским настройкам [...] Чтобы избежать повреждения данных, вы должны синхронизировать доступ к данным. Используйте блокировки Core Data, SQLite или Posix для координации доступа к данным в общем контейнере.
Цель виджета — предоставлять ежеминутный обзор вашего приложения. Минимизируя объем данных, к которым у виджета есть доступ, вы уменьшите количество головных болей, а также сделаете ваш виджет более компактным. Помните, что с большой силой приходит большая ответственность, и если вы думаете, что храните всю свою информацию в одном общем контейнере, то вам придется за многое нести ответственность...
Пример
Недавно я закончил создание виджета для новостного приложения, которое отображает главные новости, а также возможность персонализировать содержимое, отображаемое виджетом. Вот базовая разбивка постоянства данных, чтобы дать вам представление:
Разбивка хранилища
Виджет
- Изображения, отображаемые в данный момент
- Дата последнего изменения фида JSON (чтобы мы знали, когда сообщить виджету о добавлении нового контента)
Приложение
- Все истории, изображения и пользовательский контент и т. д.
Общий контейнер
- Темы, выбранные пользователями
- Список главных историй
Когда виджет получает запрос на получение контента, он загружает файл JSON, содержащий главные новости по всем темам. Этот JSON сохраняется в общем контейнере. Причина, по которой мы сохраняем все истории, заключается в том, что на случай, если пользователь изменит свои любимые темы, виджет может просто обновить свой выбор, поскольку все темы сохранены. Это также позволяет приложению обновлять главные новости и виджет, чтобы немедленно отражать это.
Затем виджет извлечет 3 главных новости, которые соответствуют указанным пользователем тегам темы. Эти основные темы сохраняются в общем элементе пользовательских настроек по умолчанию. Естественно, возможно, что виджет открывается до того, как пользователь выберет темы, в этом случае виджет автоматически выберет первые три темы или около того.
TL;DR
Метафора. Если виджет и приложение являются коллегами на рабочем месте, то общий контейнер подобен компьютеру. Насколько продуктивно вы будете работать с кем-то весь день, каждый день за одним и тем же компьютером?
person
Daniel Galasko
schedule
29.01.2015