Есть ли слабые места для хранения всех данных в области контейнера групп приложений на iOS8?

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

Есть ли слабые места для хранения всех данных в области контейнера групп приложений на iOS8? Должен ли я хранить ограниченные данные в области контейнера группы приложений?

Руководство по программированию расширений приложений: обработка распространенных сценариев


person mono    schedule 29.01.2015    source источник


Ответы (1)


Естественно, это зависит от вашего приложения, но вот мои два цента:

Хранение всей вашей информации в общем каталоге является полным излишеством и не похоже на то, что оно исходит из каких-либо разумных рассуждений. Если вы чувствуете, что вашему виджету нужна вся информация, необходимая вашему приложению, возможно, вам следует пересмотреть сложность своего виджета.

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

Общие контейнеры также отличаются от песочницы приложения, поскольку вам нужно беспокоиться о координации операций чтения и записи. Вот почему, как правило, лучше всего использовать Core Data или NSUserDefaults (экземпляр с именем пакета). Если ваше приложение хранит изображения и другой контент, вас ждет мир боли. Даже Apple рекомендует пользовательские настройки по умолчанию (поскольку это единственный пример, который они приводят) или CoreData:

После того, как вы включите группы приложений, расширение приложения и содержащее его приложение могут использовать API NSUserDefaults для совместного доступа к пользовательским настройкам [...] Чтобы избежать повреждения данных, вы должны синхронизировать доступ к данным. Используйте блокировки Core Data, SQLite или Posix для координации доступа к данным в общем контейнере.

Цель виджета — предоставлять ежеминутный обзор вашего приложения. Минимизируя объем данных, к которым у виджета есть доступ, вы уменьшите количество головных болей, а также сделаете ваш виджет более компактным. Помните, что с большой силой приходит большая ответственность, и если вы думаете, что храните всю свою информацию в одном общем контейнере, то вам придется за многое нести ответственность...

Пример

Недавно я закончил создание виджета для новостного приложения, которое отображает главные новости, а также возможность персонализировать содержимое, отображаемое виджетом. Вот базовая разбивка постоянства данных, чтобы дать вам представление:

Разбивка хранилища

Виджет

  • Изображения, отображаемые в данный момент
  • Дата последнего изменения фида JSON (чтобы мы знали, когда сообщить виджету о добавлении нового контента)

Приложение

  • Все истории, изображения и пользовательский контент и т. д.

Общий контейнер

  • Темы, выбранные пользователями
  • Список главных историй

Когда виджет получает запрос на получение контента, он загружает файл JSON, содержащий главные новости по всем темам. Этот JSON сохраняется в общем контейнере. Причина, по которой мы сохраняем все истории, заключается в том, что на случай, если пользователь изменит свои любимые темы, виджет может просто обновить свой выбор, поскольку все темы сохранены. Это также позволяет приложению обновлять главные новости и виджет, чтобы немедленно отражать это.

Затем виджет извлечет 3 главных новости, которые соответствуют указанным пользователем тегам темы. Эти основные темы сохраняются в общем элементе пользовательских настроек по умолчанию. Естественно, возможно, что виджет открывается до того, как пользователь выберет темы, в этом случае виджет автоматически выберет первые три темы или около того.

TL;DR

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

person Daniel Galasko    schedule 29.01.2015
comment
Я занимаюсь этой проблемой, но, похоже, вы не указываете никакой разницы между хранением данных в каталоге документов и каталогом общей группы приложений. Мое приложение позволяет пользователю выбирать и загружать темы, фотографии. Что я могу сделать, если я загружаю файл и хочу, чтобы расширение моего приложения использовало его вместе? Что, если я хочу, чтобы приложение и расширение приложения имели доступ к одной базе данных? - person TomSawyer; 08.02.2016
comment
@TomSawyer спасибо за отзыв. Обновлю свой пост, но суть в том, что пользователи могут удалить ваше расширение, которое удалит общий контейнер :) - person Daniel Galasko; 18.02.2016
comment
Я создал вопрос здесь stackoverflow.com/questions/35273038/ Я храню данные в папке группы приложений и не уверен, что это безопасно :( - person TomSawyer; 18.02.2016