Arhn - архитектура программирования

Cocoa Touch Framework и CoreData

Я пытаюсь использовать CoreData в своей Cocoa Touch Framework. В качестве примера я создаю простой проект: https://github.com/JakubMazur/SO41698466

В основном я делаю это по шагам:

  1. Создайте фреймворк с модульными тестами
  2. Добавить CoreData в проект someDataModel
  3. Заполните CoreData какой-нибудь фиктивной сущностью и измените модуль на Current Product Module
  4. Затем я создал SomeClass для начала, и он в основном называется:

.

public class func entityCreation() {
    Entity(context: CoreDataClass().persistentContainer.viewContext)
}

Итак, с этим lazy автоматически сгенерированным кодом из CoreData это должно создать модель.

  1. В тесте я написал:

.

func testExample() {
    SomeClass.entityCreation()
}
  1. И запустить тест
  2. В CoreDataClass я поставил точку останова ниже строки: let container = NSPersistentContainer(name: "someDataModel") и затем я вижу в консоли:

[ошибка] ошибка: не удалось загрузить модель с именем someDataModel CoreData: ошибка: не удалось загрузить модель с именем someDataModel

Итак, у меня есть 2 вопроса:

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

Загрузите проект здесь: https://github.com/JakubMazur/SO41698466

Решение найдено и добавлено ниже

let modelURL = Bundle(for: type(of: self)).url(forResource: "someDataModel", withExtension: "momd")! 
let managedObjectModel = NSManagedObjectModel(contentsOf: modelURL) 
let container = NSPersistentContainer(name: "someDataModel", managedObjectModel: managedObjectModel!)

  • Это кажется сложнее, чем должно быть, чтобы исправить. NSPersistentContainer, похоже, не может найти модель в основном пакете, предположительно из-за того, что вы создаете фреймворк. Вы можете преодолеть это препятствие, найдя и указав модель самостоятельно, а затем используя инициализатор name: managedObjectModel: для NSPersistentContainer, но тогда вы столкнетесь с другой проблемой... 17.01.2017
  • Ха, это была отличная подсказка @jrturton! Конечно, это не основной пакет. Я исправил это с помощью: let modelURL = Bundle(for: type(of: self)).url(forResource: "someDataModel", withExtension: "momd")! let managedObjectModel = NSManagedObjectModel(contentsOf: modelURL) let container = NSPersistentContainer(name: "someDataModel", managedObjectModel: managedObjectModel!) Спасибо! 17.01.2017
  • Затем я получил предупреждения о недопустимом описании объекта и понял, что мне нужно вернуться к работе, извините... 17.01.2017

Ответы:


1

TLDR;

Apple рекомендует создать подкласс NSPersistentContainer в своей структуре. Если вы сделаете это, то будет выполняться поиск во фреймворке, в котором определен подкласс.

Итак, вы можете просто:

final class PersistentContainer: NSPersistentContainer { }

Затем используйте PersistentContainer, а не NSPersistentContainer в своей структуре.

Объяснение

Инициализатор name просматривает только основной пакет.

Чтобы найти управляемую объектную модель в другой среде, вы можете получить URL-адрес модели, как предложено в комментариях.

Однако в качестве альтернативы вы также можете создать подкласс NSPersistentContainer в своей структуре, тогда будет работать инициализатор name.

Вот отрывок из видео WWDC Core Data Best Practices:

... скажем, мы хотим включить наш уровень модели в свою собственную структуру.

Мы можем сделать это, создав новую цель фреймворка в Xcode и переместив в нее наш код.

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

Это связано с тем, что по умолчанию он проверяет только основной пакет.

Зачем останавливаться на достигнутом?

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

Как это исправить?

Что ж, мы могли бы сами реанимировать модель из пакета фреймворка и использовать один из других инициализаторов контейнера, например тот, который принимает явную управляемую объектную модель, но у NSPersistentContainer на самом деле есть способ изменить, какой пакет он ищет.

Видите ли, NSPersistentContainer знает, когда он был создан подклассом, и будет использовать тип подкласса в качестве подсказки при поиске модели.

Все, что нам нужно сделать, чтобы воспользоваться этим, — это создать подкласс.

В нем даже ничего не должно быть.

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

https://asciiwwdc.com/2018/sessions/224

11.07.2018
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..