Дублирование файлов в папке DerivedData с помощью генератора CoreData

Я пытаюсь создать NSManagedModels из моей модели данных. Генерация работает, но после того, как я получил много ошибок:

ошибка: имя файла «Station+CoreDataProperties.swift» используется дважды: «/Users/Me/MyApp/Models/CoreData/Station+CoreDataProperties.swift» и «/Users/Me/Library/Developer/Xcode/DerivedData/MyApp-gwacspwrsnabomertjnqfbuhjvwc/ Build/Intermediates/MyApp.build/Debug-iphoneos/MyApp.build/DerivedSources/CoreDataGenerated/Model/Station+CoreDataProperties.swift' :0: примечание: имена файлов используются для различения частных объявлений с одинаковыми именами

Я пытаюсь очистить папку сборки и удалить каталог производных данных. Я использую Xcode 8 BETA, может быть, это ошибка?


person Ludovic    schedule 04.07.2016    source источник
comment
Попробуйте удалить производные данные, Xcode -> Файл -> Настройки проекта.   -  person    schedule 04.07.2016
comment
@AlvinVarghese Lit Я сказал в своем посте, что жесткое удаление не работает! Спасибо   -  person Ludovic    schedule 04.07.2016
comment
Дважды проверьте каталог вашего проекта, чтобы Station+CoreDataProperties.swift не существовало.   -  person    schedule 04.07.2016
comment
Вы используете cocoapods? Если да, вы должны указать use_frameworks! в своем podfile и построить его снова.   -  person Dershowitz123    schedule 04.07.2016
comment
@AlvinVarghese Этот файл существует в каталоге моего проекта и в DerivedData.   -  person Ludovic    schedule 04.07.2016
comment
bugreport.apple.com   -  person Tom Harrington    schedule 05.07.2016
comment
@TomHarrington Готово! Эта ошибка не исправлена ​​​​в BETA 2 :-( Откат к XCode 7 и Swift 2.2 решает проблему.   -  person Ludovic    schedule 06.07.2016
comment
@ Людовик Это не вариант; Я начал проект с шаблона Xcode 8/Swift 3 (Master Detail + CoreData).   -  person Nicolas Miari    schedule 29.09.2016
comment
@NicolasMiari что?   -  person Ludovic    schedule 29.09.2016
comment
Не удается вернуться к Xcode 7.3.1/Swift 2.2   -  person Nicolas Miari    schedule 30.09.2016
comment
@NicolasMiari да, Xcode 8 стабилен. Мой пост был с бета-версией Xcode 8 и стабильной версией 7.   -  person Ludovic    schedule 30.09.2016
comment
Изменение значения свойства codegen может не сохраниться, если оно не сопровождается изменением сущности (например, переименованием атрибута).   -  person Nate Whittaker    schedule 16.12.2016


Ответы (7)


Я получаю это в Xcode 8.1. Для меня следующие шаги решили проблему. Обратите внимание, что порядок имеет значение.

1) Создайте объект в модели Core Data.

2) В разделе класса выполните настройки, как показано на следующем изображении.

Модуль: Текущее название продукта

Codegen: Руководство/Нет

3) Создайте свой подкласс NSManagedObject.

введите здесь описание изображения

person Vladimir Shutyuk    schedule 01.11.2016
comment
Для других, если ваша модель Core Data находится во встроенной структуре, вам нужно установить Module на Global, иначе вы получите две компилируемые версии ваших подклассов (автоматически сгенерированные Xcode и те, которые вы определили). Когда вы вносите это изменение, убедитесь, что вы также воссоздали свои подклассы! Если вы этого не сделаете, вы получите ошибки. - person toast; 05.12.2016
comment
Потрясающий. Сэкономленное время. - person Anilkumar iOS - ReactNative; 28.09.2018

Этот пост очень помог мне решить эту проблему самостоятельно. Лично я смотрю на это как на ошибку Xcode. Ошибка или нет, это огромная ситуация с курицей и яйцом.

Я столкнулся с этим:

  1. Создал новый проект, используя Core Data
  2. Сгенерировал мой NSManagedObject подкласс+расширение (пока codegen: ClassDefinition)
  3. Я случайно сохранил сгенерированные классы в неправильной папке
  4. Я удалил сгенерированные файлы
  5. Восстановлен в папке, которую я хотел
  6. ????- Ошибки Xcode used twice

Как писали другие, я продолжал чистить свою сборку (и clean build folder), но это так и не решило проблему сборки.

Наконец-то я понял, если вы изначально создали свои NSManagedObject сгенерированные классы с codegen: ClassDefinition, как я сделал, не зная, то вы заблокированы для проблемы с курицей и яйцом.

Затем я удалил автоматически сгенерированные классы, подумав, что мне нужно сгенерировать заново, что я и сделал. После повторной генерации я снова получаю ошибку сборки used twice. Я вручную зашел в ../DerivedSources/CoreDataGenerated/Model/.. и удалил дубликаты. Опять же, я повторно сгенерировал, думая, что у меня будет только 1 копия (в моем проекте), но я ошибся. Если изначально было установлено codegen: ClassDefinition, то Xcode продолжит создавать классы auto-generated+расширения и поместить их в скрытую папку ../DerivedSources/CoreDataGenerated/Model/... Я повторил эту курицу и яйцо несколько раз, прежде чем понял.

Позже я понял, что вам действительно нужно отметить codegen: Manual/None, однако, чтобы вернуть синхронизацию, вам нужно удалить автоматически сгенерированные файлы в ../DerivedSources/CoreDataGenerated/Model/.. и в вашем проекте, если они у вас еще есть.

Будьте осторожны с настройкой codegen: Manual/None, для меня это было немного сложно, потому что codegen: Manual/None не прилипало. Мне пришлось щелкать туда и обратно между объектами несколько раз, чтобы дважды/тройно проверить, что для каждого объекта установлено значение codegen: Manual/None. Затем автоматически сгенерируйте файлы. На этом этапе ваша единственная копия автоматически сгенерированных файлов должна находиться в вашем проекте, а не в ../DerivedSources/CoreDataGenerated/Model/...

Наконец, я думаю, что это ошибка, потому что, если вы укажете codegen: Manual/None, я не ожидаю, что Xcode вообще автоматически сгенерирует файлы, но он это сделает и поместит их в ваш проект. Еще больше сбивает с толку, если ваша настройка равна codegen: ClassDefinition, кто, черт возьми, знает, что Xcode поместит файлы в скрытый каталог, но он будет доступен для использования в вашем проекте. Моя претензия к этому заключается в том, что автоматически сгенерированные файлы не контролируются исходным кодом, и если я сменю компьютер, я должен знать, чтобы автоматически сгенерировать их на новой станции.

Надеюсь, это поможет кому-то еще!

Ваше здоровье!

person kev    schedule 03.12.2016

Это действительно не ошибка. Как предполагает @Morrowless, создаются как определение класса, так и расширение свойств. Если это нежелательно, выберите Вручную/Нет в Codegen перед созданием кода. Если код уже сгенерирован, просто удалите их и повторите попытку Editor->Create NSManagedObject Subclass... из меню (после установки вручную/нет).

Обратите внимание, что на рисунке ниже имя класса «Контакт» относится к моему проекту. Вместо этого вы увидите имя вашего объекта.

введите здесь описание изображения

person oyalhi    schedule 20.10.2016
comment
Пожалуйста, проверьте Apple Bug Reporter и прочитайте мой пост еще раз! Apple решила эту проблему в версии 8.1. - person Ludovic; 28.10.2016
comment
Только что скачал 8.1. Добавил TestEntity в мою модель и добавил два атрибута, String и Date, и создал NSManagedObjectSubclass из меню. Не к моему удивлению, я все еще получаю сообщение об ошибке, так как это не было ошибкой. Мое решение выше сработало и устранило проблему. Вам нужно установить Module на Current Product Module и Codegen на Manual/None. - person oyalhi; 28.10.2016
comment
В моем проекте было установлено руководство, обновление до 8.1 решило мою проблему. Посмотрите на баг-трекер. Но вы правы, если пользователь не устанавливает ручной режим, это не ошибка :) - person Ludovic; 28.10.2016

Если вы сгенерировали подклассы CoreData с помощью codegen: ClassDefinition, вы в основном облажались. Единственный способ исправить это:

  1. Удалите свои подклассы CoreData.
  2. Удалите папку производных данных.
  3. Очистите ваш проект (CMD+K).
  4. Создайте новые подклассы CoreData, на этот раз выберите Codegen: Manual/None и Module: Current Product Module
person 100grams    schedule 16.03.2017
comment
Он не облажался. Удаление DerivedData, изменение свойства «Codegen» для каждой сущности на Manual/None, затем очистка и сборка сделают свое дело. Нет необходимости удалять и заново создавать подклассы CoreData. - person John Rogers; 06.06.2017

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

Из примечаний к выпуску Xcode 8.0:

Xcode автоматически генерирует классы или расширения классов для сущностей и свойств в модели данных Core Data. Автоматическая генерация кода включается и отключается для каждой сущности отдельно, а также для всех сущностей в новых моделях, использующих формат файла Xcode 8. Эта функция доступна для любой модели данных, обновленной до формата Xcode 8. Вы указываете, генерирует ли Xcode код Swift или Objective-C для модели данных, используя инспектор файлов модели данных.

Когда для сущности включена автоматическая генерация кода, Xcode создает либо класс, либо расширение класса для сущности, как указано в инспекторе сущности: используется указанное имя класса, а источники помещаются в производные данные проекта. Как для Swift, так и для Objective-C эти классы можно использовать непосредственно из кода проекта. Для Objective-C создается дополнительный заголовочный файл для всех сгенерированных сущностей в вашей модели. Имя файла заголовка соответствует соглашению об именовании «DataModelName+CoreDataModel.h».

Однако, если вы выбрали категорию/расширение в раскрывающемся меню codegen в инспекторе модели данных (потому что вы хотите добавить логику в свою модель): codegen неправильно сгенерирует как определение класса, так и свойства расширение.

Решение состоит в том, чтобы просто удалить расширение свойств (ClassName+CoreDataProperties.swift). Теперь ваш проект должен скомпилироваться.

person Morrowless    schedule 03.10.2016
comment
Пожалуйста, проверьте Apple Bug Reporter и прочитайте мой пост еще раз! Apple решила эту проблему в версии 8.1. - person Ludovic; 28.10.2016

Следуя указаниям oyalhi и Владимира Шутюка (удаление файлов NSManagedObject, изменение объекта codegen на Manual/None), мне пришлось перезапустить Xcode, чтобы он снова проиндексировался, прежде чем я смог повторно сгенерировать файлы NSManagedObject и получить успешную компиляцию.

person Jacob F. Davis C-CISO    schedule 02.11.2016

Для полноты..:

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

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

Оказывается, XCode переименовывает дубликаты, добавляя 1, 2,... к имени сущности, но оставляет имя класса прежним. И поскольку теперь имя объекта и имя класса «не связаны», переименование объекта также не изменит имя класса.

Надеюсь, это кому-то поможет - я также подал отчет об ошибке для этого.

person Toastor    schedule 12.04.2018