web-dev-qa-db-fra.com

Core Data Codegen échoue dans Xcode 8

J'ai une application iOS contenant un modèle Core Data avec 6 entités. L'entité Name est configurée comme suit:

Nom de classe: Nom 

Module: Module produit actuel

Codéine: Définition de classe

(les 5 autres entités sont configurées de la même manière).

Problème 1 (se fixe mais part pour la postérité)

Le code IS généré dans le dossier de données dérivé… non pas en tant que ~ définitions de classe comme prévu, mais en tant qu'extensions (nommées comme Name+CoreDataProperties.Swift. Cela ne semble pas avoir d'importance si Codegen est défini sur Définition de classe ou Catégorie/extension - J'ai toujours le même résultat.

OK, maintenez cette pensée - les fichiers de classe et d'extension SONT en train d'être générés… il semble que vous deviez supprimer le dossier de données dérivé du projet et redémarrer Xcode entre les mises à jour. Ignorer le problème 1

Problème 2

Les fichiers générés ignorent le modèle de données Paramètre d'indicateur facultatif pour les attributs et relations de chaîne - ils sont tous générés en tant qu'options.

Problème 3 (se fixe mais part pour la postérité)

Les relations commandées sont générées sous la forme OrderedSet (et une erreur de compilation) plutôt que NSOrderedSet (ne peuvent pas les modifier car elles sont régénérées).

La solution pour moi consistait à ajouter temporairement au projet… public typealias OrderedSet = NSOrderedSet 

OK, le compilateur a maintenant disparu et OrderedSet semble être reconnu. Ignorer le problème 3.

_ {Problème 4} _

Aucune de ce qui précède n’importe vraiment, car le compilateur ne peut pas trouver les fichiers qu’il vient de générer. Pour l'entité Name ci-dessus:

: 0: erreur: aucun fichier ou répertoire de ce type: '/Users/ashleymills/Library/Developer/Xcode/DerivedData/-grfqveelvqtlydbpwjmfdietnrss/Build/Intermediates/.build/Debug-iphonesimulator/.build/DerivedSources/CoreData : 0: erreur: aucun fichier ou répertoire de ce type: '/Users/ashleymills/Library/Developer/Xcode/DerivedData/-grfqveelvqtlydbpwjmfdietnrss/Build/Intermediates/.build/Debug-iphonesimulator/.build/DerivedSources/CoreDataGener

Il recherche dans les données dérivées les fichiers .Name+CoreDataClass.Swift et .Name+CoreDataProperties.Swift - remarquez le '.' au début des noms de fichiers. (En tant que correctif temporaire, j'ai ajouté les fichiers générés dans le projet)

Je suppose que je fais quelque chose de mal, comme si c'était le cas pour tout le monde, personne ne serait capable de construire un projet Core Data… ou ces bogues doivent-ils être corrigés?

À la vôtre Ash

(Également soulevé sur les forums Apple dev)

17
Ashley Mills

Concernant Problème 1 , le paramétrage de la fenêtre contextuelle Codegen dans l'inspecteur pour une entité d'un fichier .xcdatamodel est supposé fonctionner comme suit:

Catégorie/Extension indique à Xcode de générer le fichier one , ClassName + CoreDataGeneratedProperties.

Définition de classe indique à Xcode de générer deux fichiers, le fichier nommé ci-dessus, ainsi que ClassName + CoreDataClass.

Cependant, il semble y avoir un bogue dans Xcode 8.2. Si, après avoir modifié l'une de ces fenêtres contextuelles, il vous suffit de construire (⌘B) ou d'exécuter (R), vos modifications ne prendront effet. Par exemple, si vous passez de Définition de la classe à Catégorie/Extension et même si vous supprimez manuellement le second fichier, il réapparaîtra. Vous pouvez même constater que la fenêtre contextuelle revient au paramètre d'origine.

Pour que les modifications de ces fenêtres contextuelles prennent effet, vous devez:

  1. Enregistrer (⌘S) le fichier .xcdatamodel.
  2. Fermez toutes les fenêtres du projet.
  3. Rouvrez le projet.

Lors de la prochaine génération (ce qui peut se produire automatiquement à l'ouverture du projet si vous avez un @IBInspectable dans un storyboard), les fichiers affectés dans les données dérivées sont générés ou supprimés pour être conformes à votre nouveau paramètre.

MISE À JOUR 2016-12-22: Merci pour le commentaire, Ashley. Je viens de rédiger et de soumettre ce texte à Apple Bug Reporter: 29789727. Mise à jour 2017-02-08: Apple a fermé le 29789727 car il est censé dupliquer le numéro 21205277.

8
Jerry Krinock

Le problème 4 peut être résolu (au moins dans la dernière version bêta, v. 6) en sélectionnant toutes les entités que vous voulez générer automatiquement, puis en effaçant le champ Classe -> Module de sorte qu'il passe par défaut à "Espace de noms global". 

6
Carl F. Hostetter

En ce qui concerne le problème 2: le drapeau "optionnel" de Core Data n’a rien à voir avec le concept Swift d’optionnel. Ils ne sont pas liés et ne veulent pas dire la même chose. Marquer un attribut Core Data comme non optionnel n'implique pas qu'il soit non optionnel car Swift définit le terme. La différence est:

  • Les non-optionnels rapides doivent avoir des valeurs non nulles à tout moment .
  • Les données non optionnelles de Core Data doivent avoir des valeurs non nuls lorsque vous enregistrez les modifications , mais Core Data ne sait ni ne se soucie de savoir si elles sont nulles à d'autres moments.

Le problème n ° 4 sonne comme si Xcode obtenait un état confus, et pourrait être corrigé par voodoo, comme effacer manuellement le dossier de données dérivé (encore une fois, je le sais). Je ne peux pas le reproduire actuellement, mais cela ne veut pas dire que ce n'est pas un bug de la version bêta actuelle.

2
Tom Harrington

Je suis resté complètement coincé avec Problème 4 et rien de ce qui précède n'a fonctionné pour moi. J'utilise la génération de code. Pour résoudre ce problème, j'ai suivi les étapes suivantes:

  1. J'ai ouvert le fichier .xcdatamodel/content dans un éditeur de texte. (Dans Xcode, cliquez avec le bouton droit de la souris sur votre fichier .xcdatamodel et choisissez "Ouvrir dans un éditeur externe". 
  2. Dans le fichier XML, je me suis assuré que chaque entité avait codeGenerationType="class" 
  3. Fermer et rouvrir Xcode Effacé mon dossier de données différé 
  4. Il refusait toujours de faire la génération de code, alors j’ai ensuite généré manuellement chaque entité (éditeur, créer des sous-classes NSManageObject, sélectionner toutes les entités). 
  5. Construisez le projet. Maintenant, la génération de code et les erreurs de compilation sont également apparues, indiquant que les noms de fichiers de l'entité étaient utilisés deux fois. 
  6. Suppression des sous-classes NSManagedObject créées manuellement créées à l'étape 5.
  7. Après cela, le projet a été reconstruit avec succès et le problème a disparu.

PS: Si vous choisissez de créer manuellement vos sous-classes NSManageObject plutôt que d’utiliser la génération de code, veillez à supprimer codeGenerationType="class" de vos entités dans le fichier XML à l’étape 2.

1
Bocaxica

Il semble que Xcode 8.2.1 ne désactive pas codegen . Mais vous pouvez supprimer manuellement codeGenerationType="category" du fichier de contenu .xcdatamodel.

Fermez Xcode, supprimez codeGenerationType, supprimez le dossier DerivedData et reconstruisez.

Attendra le correctif dans les prochaines versions.

1
AlKozin

C'est en fait assez facile à résoudre. 

Aller à la configuration:

 enter image description here

Puis supprimez les points. Ce ne sont là que dans les projets plus anciens . Les instructions d'importation sont corrigées après cela et vous êtes bon pour aller.

Vous devez également placer vos modèles dans l’espace de nom global. Les miens étaient dans un espace de noms supplémentaire, mais je ne sais pas pourquoi.

Pommes approche est que vous pouvez utiliser cela dans un cadre personnalisé.

Cette fonctionnalité est jolie, si vous la faites fonctionner;)

1
Tobias