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

Первым шагом будет добавление основного приложения и расширения в одну группу приложений. Несмотря на то, что приложение и расширение связаны вместе, у них нет доступа к контейнеру друг друга. Добавление их в одну группу приложений создает общий контейнер, который будет использоваться для обмена данными. Мы сделаем это, выбрав приложение из списка Целей. Выберите Возможности, а затем выберите / создайте группу. Сделайте то же самое для своего расширения.

Следующее изображение упрощает визуализацию результирующей архитектуры.

Наша следующая задача - разместить основное хранилище данных в общем контейнере. Apple предоставляет разработчикам класс NSPersistentContainer, который упрощает управление основным стеком данных. В классе есть метод defaultURLDirectory, который мы переопределим, чтобы сделать общий контейнер местоположением по умолчанию для основного хранилища данных.

Мы создали новый класс с NSPersistentContainer в качестве родительского. Затем мы переопределяем метод defaultURLDirectory. Мы почти закончили.

Затем мы изменяем наш код, чтобы использовать этот настраиваемый класс вместо NSPersistentContainer при настройке нашего стека (строка 11).

Мы используем тот же код для настройки основного стека данных в ShareViewController.swift (общий лист).

Мы почти закончили. Обратите внимание, что теперь мы можем получить доступ к контексту представления в любой функции. Прежде чем мы начнем праздновать, нужно сделать еще одно. Мы собираемся сделать нашу модель доступной в расширении. Для этого мы просто выбираем модель (.xcdatamodeld) и на правой панели выбираем расширение в разделе Целевое членство.

Теперь наше приложение и расширение могут читать и записывать в одно и то же основное хранилище данных и использовать одну и ту же модель.