2016-07-04 53 views
25

Sto provando a generare NSManagedModels dal mio datamodel. La generazione funziona ma dopo ho ricevuto molti errori:Duplicare i file nella cartella DerivedData utilizzando il generatore CoreData

error: filename "Station+CoreDataProperties.swift" used twice: '/Users/Me/MyApp/Models/CoreData/Station+CoreDataProperties.swift' and '/Users/Me/Library/Developer/Xcode/DerivedData/MyApp-gwacspwrsnabomertjnqfbuhjvwc/Build/Intermediates/MyApp.build/Debug-iphoneos/MyApp.build/DerivedSources/CoreDataGenerated/Model/Station+CoreDataProperties.swift' :0: note: filenames are used to distinguish private declarations with the same name

Provo la cartella di compilazione pulita e la directory derivata directory difficile. Sto usando Xcode 8 BETA forse è un bug?

+0

provare a cancellare i dati derivati, Xcode -> File -> Impostazioni progetto. –

+0

@AlvinVarghese Acceso Ho detto che nel mio post la cancellazione dura non funziona! Grazie – Ludovic

+0

Controlla la tua directory di progetto verifica che '' 'Station + CoreDataProperties.swift''' non esista due volte. –

risposta

48

ottengo questo in Xcode 8.1 Per me seguenti operazioni risolto il problema. Si prega di notare che l'ordine conta.

1) Creare l'entità nel modello Core Data.

2) Nella sezione classe, effettuare le impostazioni come nell'immagine seguente.

Modulo: corrente Nome del prodotto

Codegen: Manuale/Nessuno

3) Generare sottoclasse NSManagedObject.

enter image description here

+3

Per gli altri, se il tuo modello di Core Data è in un framework embedded, devi impostare 'Module' su' Global' altrimenti devi finiscono con la compilazione di due versioni delle sottoclassi (quelle generate automaticamente da Xcode e quelle che hai definito). _Quando apporti questa modifica, assicurati di ricreare anche le sottoclassi! _ Se non lo fai, finirai per – toast

+0

Great! Ha funzionato! – marko

3

Questo non è un bug. Codegen genera questi file nella cartella DerivedData, quindi non è necessario crearli nuovamente nel progetto, quindi l'errore di compilazione.

Da Xcode Note 8.0 di rilascio:

Xcode automatically generates classes or class extensions for the entities and properties in a Core Data data model. Automatic code generation is enabled and disabled on an entity by entity basis, and is enabled for all entities in new models that use the Xcode 8 file format. This feature is available for any data model that has been upgraded to the Xcode 8 format. You specify whether Xcode generates Swift or Objective-C code for a data model using the data model’s file inspector.

When automatic code generation is enabled for an entity, Xcode creates either a class or class extension for the entity as specified in the entity's inspector: the specified class name is used and the sources are placed in the project’s Derived Data. For both Swift and Objective-C, these classes are directly usable from the project’s code. For Objective-C, an additional header file is created for all generated entities in your model. The header file name conforms to the naming convention “DataModelName+CoreDataModel.h”.

Tuttavia, se è stata selezionata Categoria/estensione sotto il menu codegen a tendina nel modello di dati ispettore (perché si vuole aggiungere la logica al modello): codegen genererà erroneamente sia la definizione della classe che l'estensione delle proprietà.

La soluzione è eliminare semplicemente l'estensione di proprietà (ClassName + CoreDataProperties.swift). Il tuo progetto dovrebbe ora compilare.

+0

Per favore controlla Apple Bug Reporter e leggi di nuovo il mio post! Apple Risolve il problema con 8.1 – Ludovic

7

Questo non è un bug. Come @Morrowless suggerisce sia la definizione della classe che l'estensione delle proprietà. Se non si desidera, selezionare Manuale/Nessuno in Codegen prima del che genera il codice. Se il codice è già stato generato, è sufficiente eliminarli e provare nuovamente Editor->Create NSManagedObject Subclass... dal menu (dopo aver impostato Manuale/Nessuno).

Nota, nella figura seguente, il nome della classe "Contatto" è specifico per il mio progetto. Vedrai invece il nome dell'entità.

enter image description here

+0

Per favore controlla Apple Bug Reporter e leggi di nuovo il mio post! Apple ha risolto questo problema con 8.1 – Ludovic

+0

Appena scaricato 8.1 Aggiunto un TestEntity al mio modello e aggiunto due attributi, String and Date, e creato NSManagedObjectSubclass dal menu. Non con mia sorpresa, ho ancora ricevuto l'errore, in quanto questo non era un bug in primo luogo. La mia soluzione sopra funzionava e risolveva il problema. È necessario impostare il 'Modulo' su' Modulo prodotto corrente' e 'Codegen' su' Manuale/Nessuno'. – oyalhi

+0

Il manuale è stato impostato nel mio progetto, l'aggiornamento a 8.1 ha risolto il problema. Guarda il bug tracker. Ma hai ragione se l'utente non imposta la modalità manuale non è un bug :) – Ludovic

0

Dopo aver seguito la guida da oyalhi e Vladimir Shutyuk, (l'eliminazione dei file NSManagedObject, modificando l'entità codegen a Manual/None), ho dovuto riavviare Xcode per permettere all'indice di nuovo prima che io potessi ri-generare i file NSManagedObject e ottenere una compilazione di successo.

8

Questo post mi ha aiutato molto a risolvere questo problema. Personalmente lo considero un bug Xcode. Bug o no questa è una situazione enorme di uova e galline.

Mi sono imbattuto in questo:

  1. Creato un nuovo progetto utilizzando Core Data
  2. generato il NSManagedObject sottoclasse + estensione (mentre codegen: ClassDefinition)
  3. sbaglio ho salvato le classi generate nella cartella errata
  4. Ho cancellato i file generati
  5. Ri-generato nella cartella desiderata
  6. - Xcode used twice errori

Come altri hanno già scritto ho continuato a pulire il mio build (e clean build folder), ma che non ha mai risolto il problema di costruzione.

Ho finalmente capito se in origine hai creato le tue classi NSManagedObject con codegen: ClassDefinition, come ho fatto senza sapere che sei bloccato per il problema dell'uovo e della gallina.

Ho quindi eliminato le classi generate automaticamente pensando Ho dovuto rigenerare, così ho fatto. Una volta rigenerato, otterrei nuovamente l'errore di build used twice. Sono passato manualmente allo ../DerivedSources/CoreDataGenerated/Model/.. e ho eliminato i duplicati . Ancora una volta, ho rigenerato pensando che avrei avuto solo 1 copia (nel mio progetto) ma ho sbagliato. Se codegen: ClassDefinition è stato impostato in origine, Xcode continuerà a creare le classi + estensioni auto-generated e le inserirà nella cartella sepolta ../DerivedSources/CoreDataGenerated/Model/... Ho ripetuto questo pollo e l'uovo un paio di volte prima di accendere.

In seguito mi sono reso conto che in effetti è necessario contrassegnare lo codegen: Manual/None per ripristinare la sincronizzazione dei file auto-generati in ../DerivedSources/CoreDataGenerated/Model/.. e nel progetto se ce ne sono ancora.

Fare attenzione impostazione codegen: Manual/None, per me è stato un po 'complicato perché codegen: Manual/None non bastone. Ho dovuto fare clic avanti e indietro tra le entità più volte per controllare doppio/triplo ogni entità è stata impostata su codegen: Manual/None. Quindi generare automaticamente i file.. A questo punto la tua unica copia dei file generati automaticamente dovrebbe essere nel tuo progetto e non in ../DerivedSources/CoreDataGenerated/Model/...

Infine, penso che questo sia un errore perché se si specifica codegen: Manual/None non mi aspetto che Xcode generi automaticamente file, eppure lo fa e li inserisce nel progetto Più confusione se la tua impostazione è codegen: ClassDefinition, chi diavolo sa che Xcode metterà i file in una directory nascosta, ma è disponibile per l'uso nel tuo progetto. Il mio manzo con questo è che i file generati automaticamente non sono controllati dalla fonte e se cambio computer devo sapere di generarli automaticamente sulla nuova stazione.

Spero che questo aiuti qualcun altro!

Cheers!

4

Se le sottoclassi CoreData sono state generate con codegen: ClassDefinition, le vostre fondamentalmente si sono scopate. L'unico modo per risolverlo è:

  1. Elimina le sottoclassi CoreData.
  2. Elimina la cartella dei dati derivati.
  3. Pulisci il tuo progetto (CMD + K).
  4. generare nuove sottoclassi CoreData, questa volta selezionare Codegen: Manual/None e Module: Current Product Module
+0

Non è fregato. Cancellando 'DerivedData', cambiando la proprietà 'Codegen' su ogni entità in' Manual/None', quindi la pulizia e la costruzione faranno il trucco. e ricreare le sottoclassi CoreData. –

Problemi correlati