Core Data, suppression des warnings

olofolof Membre
03:35 modifié dans API AppKit #1
Salut à  tous,

je me lance dans une appli Core Data. Pour supprimer les warnings lors de l'utilisation des accesseurs de mes entités, j'ai créé une classe pour chacune de ces entités dans lesquelles je déclare mes attributs (@property et @dynamic).
Pour une collection, il me reste le problème d'ajout ou de suppression d'objets :

<br />[monEntite addAutreEntitesObject:monAutreEntite];<br />


J'ai déclaré cette méthode dans le .h de ma classe :

<br />-(void)addAutreEntitesObject:(AutreEntites *)value;<br />


Mais là , le compilateur me dit que c'est ma classe qui n'est pas complète (je n'ai rien ajouté dans le .h). Comment faire pour supprimer ces warnings ?

Merci !

Réponses

  • Philippe49Philippe49 Membre
    03:35 modifié #2
    Tu dois avoir

    @property (nonatomic, retain) NSMutableSet * autreEntites;

    @dynamic autreEntites

    et dans le model, To-Many Relationship doit être coché
  • olofolof Membre
    03:35 modifié #3
    dans 1242159397:

    Tu dois avoir

    @property (nonatomic, retain) NSMutableSet * autreEntites;

    @dynamic autreEntites

    et dans le model, To-Many Relationship doit être coché


    C'est bien ce que j'ai.

    Mais il râle toujours (warning, ... may not respond to ...) sur :
    <br />[monEntite addAutreEntitesObject:monAutreEntite];<br />
    


  • Philippe49Philippe49 Membre
    03:35 modifié #4
    Et évidemment, tu as codé la méthode addAutreEntitesObject: dans le .m  ?
  • Philippe49Philippe49 Membre
    03:35 modifié #5
    En parcourant la doc, et en regardant l'exemple d'Hillegass, une autre piste qui m'a semblé absurde en première analyse car très conventionnel, mais après tout ce système CoreData est bourré de conventions. Dans les deux cas, ils mettent les prototypes dans une catégorie, et non directement dans l'interface ? avec je cite
    "Core Data programming Guide, page 43 du PDF)
    "You can easily use the same techniques to suppress compiler warnings for the automatically-generated to-many relationship mutator methods"

    @interface Department (CoreDataGeneratedAccessors)<br />- (void)addEmployeesObject:(Employee *)value;<br />- (void)removeEmployeesObject:(Employee *)value;<br /><br />@end
    


    Maintenant si c'est cela je ne serais pas mécontent de comprendre pourquoi !
  • psychoh13psychoh13 Mothership Developer Membre
    03:35 modifié #6
    Les catégories sont des unités de compilation qui sont toujours chargés dynamiquement, donc les méthodes qu'elles déclarent n'ont pas besoin d'exister à  la compilation, simplement parce que toutes les méthodes, quelques soient, sont enregistrées par le runtime et sont appelées à  la demande. Contrairement aux ivars qui doivent être compilées pour pouvoir être enregistrées dans le runtime.

    C'est comme ça que marche les protocols informels, tu déclares des méthodes dans une catégorie de NSObject sans les implémenter, ça te permet, à  l'exécution, de vérifier si oui ou non une classe implémente une méthode, et de plus ça permet au compilateur de connaà®tre le prototype d'une méthode au cas où tu souhaiterais l'appeler mais qu'elle n'est pas forcément implémentée.

    Donc cette technique de suppressions des warnings et le comportement normal des catégories.
  • NoNo Membre
    03:35 modifié #7
    dans 1242292889:

    Donc cette technique de suppressions des warnings et le comportement normal des catégories.


    C'est cette même fonctionnalité qui est utilisée pour "déclarer" des méthodes non-documentées (mais qui sont réellement implantées) afin d'éviter ces warnings à  la compil'.
  • Philippe49Philippe49 Membre
    03:35 modifié #8
    Très intéressant ! Effectivement avec les protocoles informels et les méthodes non-documentées, on comprend bien le mécanisme.

    Reste
    1) à  Olof de vérifier si effectivement la définition en catégorie fait disparaà®tre des warnings, ce dont je ne doute pas compte tenu de ce que Psychoh13 et No nous disent,

    2) à  trouver une explication satisfaisante pour le Warning qui demeure si on met le prototype de la méthode dans l'interface du NSManagedObject : Une conséquence de  l'ordonnancement entre les étages CoreData : Store --> Coordinator --> ManagedObjectContext  --> les NSManagedObject
  • olofolof Membre
    03:35 modifié #9
    dans 1242302020:

    1) à  Olof de vérifier si effectivement la définition en catégorie fait disparaà®tre des warnings, ce dont je ne doute pas compte tenu de ce que Psychoh13 et No nous disent,

    Je ne sais pas si je fais quelque chose de faux, mais mes warnings persistent. J'ai créé une catégorie (FGTest, que le fichier .h) :
    <br />#import &lt;Cocoa/Cocoa.h&gt;<br />#import &quot;FGVinEntity.h&quot;<br /><br />@interface FGVinEntity (FGTest)<br /><br />-(void)addSortiesObject:(id)value;<br /><br />@end<br />
    


    Mon but étant donc d'ajouter à  mon entité FGVin la méthode addSortiesObject.

    Je fais quelque chose de faux ?

  • Philippe49Philippe49 Membre
    03:35 modifié #10
    A court d'idée ... Dans Exercice CoreData , je n'ai pas de Warnings ...
  • psychoh13psychoh13 Mothership Developer Membre
    03:35 modifié #11
    Euh... Pouvons-nous avoir le libellé exact du warning ?
  • olofolof Membre
    03:35 modifié #12
    dans 1242380834:

    Euh... Pouvons-nous avoir le libellé exact du warning ?

    Mais très volontiers :

    warning: 'FGVinEntity' may not respond to '-addSortiesObject'

    Petite précision, j'utilise cette méthode depuis un test unitaire, mais je pense bien que ça ne doit rien changer !
  • psychoh13psychoh13 Mothership Developer Membre
    03:35 modifié #13
    Ha mais c'est bien différent.

    Dans tous les .m où tu utilises cette méthode, il faut que tu importes le .h qui la déclare, pour que le compilateur voit qu'elle est bien définie et pour cette objet en particulier.
  • olofolof Membre
    03:35 modifié #14
    dans 1242404595:

    Ha mais c'est bien différent.

    Dans tous les .m où tu utilises cette méthode, il faut que tu importes le .h qui la déclare, pour que le compilateur voit qu'elle est bien définie et pour cette objet en particulier.

    Ok, je vois ! Je me suis penché un peu plus sur les catégories et les différentes manières des les implémentées. Je l'ai mise dans le fichier .h de mon entité et maintenant c'est ok.

    Merci !
Connectez-vous ou Inscrivez-vous pour répondre.