Я не могу использовать мою базовую модель данных в двух целях в проекте Swift

В имени класса для моделей сущностей в модели Core Data должно быть указано имя приложения. Таким образом, для объекта с именем User имя класса в редакторе модели должно быть MyAppName.User. Это отлично работает, пока я не добавил вторую цель в свой проект.

В новом проекте предполагается, что имена классов сущностей будут SecondAppTargetName.User. Как мы поддерживаем две цели с использованием одной и той же базовой модели данных? Я попробовал добавить ${PRODUCT_NAME}.User вместо этого, не ожидая, что он сработает. И это не работает.

Любые идеи о том, как делиться одной основной моделью данных между целями и удовлетворять потребности проектов Swift, чтобы PRODUCT_NAME добавлялся к классу в редакторе модели?

EDIT: Из документации Apple здесь видно, что добавление имени модуля в качестве префикса к имени класса в инспекторе моделирования модели является предпочтительным поведением. Если это так похоже на зияющую дыру, поскольку она исключает несколько целей, используя одну и ту же модель данных. Я до сих пор не нашел обходного пути для этого. Некоторые сообщения здесь, на SO, показали, что использование @objc (ClassName) перед определением класса Swift для управляемого объекта сделает трюк, но пока я еще не смог его проверить.

Ответ 1

Получается, что ответ, похоже, добавляет директиву @objc (ClassName) выше определения класса в файле Swift, как указано в fooobar.com/questions/160928/... о связанная с этим проблема. По крайней мере, это ответ на этом этапе с XCode 6 beta 5.

Итак, для класса сущности, называемого User, вам понадобится:

@objc(User)
class User: NSManagedObject {
    ...

Я тестировал это в проекте с двумя целевыми объектами и удалял все префиксы от инспектора модели модели, и он работает. Мне интересно, почему Apple будет включать требование префикса в свою документацию, поскольку оно накладывает ограничение на несколько целей с использованием одной и той же модели данных ядра. Похоже, что исправление @objc является правильным решением или, возможно, просто временным решением на этой стадии бета-тестирования.

Ответ 2

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

if(currentTarget==XXX){
    storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Partner.sqlite"];
}
else{
     storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"PartnerNew.sqlite"];
}

Ответ 3

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

myClass.className()

в любой из операций с основными данными. Я просто пытался быть слишком умным. Вместо этого используйте строку с именем класса.