Appeler une méthode depuis n'importe quelle classe

muqaddarmuqaddar Administrateur
Salut,

J'ai l'habitude de me servir des constantes ou des statics, mais je voudrais pourvoir accéder au résultat de cette méthode depuis n'importe où dans mon code :

<br />- (NSString*)sqlDateForGMT<br />{<br />	NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];<br />	[formatter setDateFormat:@&quot;yyyy-MM-dd HH:mm:ss&quot;];<br />	[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];<br />	return [[formatter stringFromDate:[NSDate date]] substringToIndex:19];<br />}<br />


Pour l'instant, je l'ai mis dans un Manager (singleton) que j'utilise un peu partout, mais n'y a-t-il pas mieux ? (vu que je dois du coup inclure mon singleton dans des classes modèles et ça ne me plaà®t pas).


Réponses

  • AliGatorAliGator Membre, Modérateur
    juin 2010 modifié #2
    Bah pourquoi tu ne fais pas une catégorie de NSDate ? C'est fait pour, les catégories !
    @interface NSDate (SQL)<br />-(NSString*)sqlDateForGMT;<br />@end
    
    <br />@implementation NSDate (SQL)<br />-(NSString*)sqlDateForGMT<br />{<br />&nbsp;  NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];<br />&nbsp;  [formatter setDateFormat:@&quot;yyyy-MM-dd HH:mm:ss&quot;];<br />&nbsp;  [formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];<br />&nbsp;  return [[formatter stringFromDate:self] substringToIndex:19];<br />}<br />@end
    

    Note que j'ai remplacé ton [NSDate date] par self au passage.

    Du coup une fois que tu as fait cette catégorie, tu n'as plus qu'à  l'appeler ainsi, depuis n'importe où dans ton code. C'est ça la magie des catégories :
    NSString* sqlDate = [[NSDate date] sqlDateForGMT];
    
    Tu peux même l'appeler sur une NSDate qui aurait une autre date que la date actuelle (sur une autre NSDate que [tt][NSDate date][/tt] quoi).


    PS : Pourquoi le [tt]substringToIndex:19[/tt] ?
  • muqaddarmuqaddar Administrateur
    04:20 modifié #3
    J'ai déjà  4 ou 5 catégories, mais j'avoue que j'y ai pas pensé...

    Ta solution m'a l'air... comment dire... parfaite ! 

    Il faut que j'enlève le [substringToIndex:19] qui provient d'un vieux code...

    Merci Ali.

    PS : trop de catégories ne nuit pas trop aux perfs ?
  • muqaddarmuqaddar Administrateur
    04:20 modifié #4
    Bon du coup j'en ai ajouté une seconde qui sert notamment à  enregistrer les fichiers en nom unique en se servant de la date :

    <br />- (NSString*)fileSystemDateForGMT<br />{<br />	NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];<br />	[formatter setDateFormat:@&quot;yyyy-MM-dd-HH-mm-ss&quot;];<br />	[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];<br />	return [formatter stringFromDate:self];<br />}<br />
    
  • AliGatorAliGator Membre, Modérateur
    juin 2010 modifié #5
    Je ne suis pas expert en la matière mais je ne pense pas, vu que tout est chargé dynamiquement en Objective-C, au moment du +initialize de la classe NSDate du coup, le RunTime rajoute ces définitions à  la classe de base définie dans le framework, et après pour l'appel je pense que c'est aussi rapide qu'une méthode "de base".

    Bon après je peux me tromper faudrait regarder plus en détail comment fonctionnent les appels aux méthodes de catégorie dans le RunTime. Plus d'infos ici pour les catégories, et ici pour le dynamic loading et method resolution.
    Donc à  mon avis une fois que la méthode est chargée dans le RunTime, il n'y a pas de différence à  l'appel.


    PS : Bizarres tes noms de fonctions... pas très explicites, non ? :P
  • muqaddarmuqaddar Administrateur
    04:20 modifié #6
    dans 1276764119:

    PS : Bizarres tes noms de fonctions... pas très explicites, non ? :P


    Moi je les aime bien :
    - soit une date formatée en GMT pour le SQL
    - soit une date formatée pour être un nom de fichier unique sans espace
  • AliGatorAliGator Membre, Modérateur
    04:20 modifié #7
    "fileSystemDateForGMT" ça me fait penser à  "la date du filesystem" (donc genre méthode appellée sur un path de fichier, pour retourner la date dudit fichier)...
    Je verrais plutôt "stringRepresentationForFilesystem" ou "fileSystemRepresentation" (ou fileSystemStringRepresentation ...) et SQLRepresentation ou SQLString ou stringRepresentationForSQL...

    En fait, maintenant que c'est une catégorie de NSDate, et donc que tu appelles cette méthode sur un objet NSDate, ça n'a plus de sens que tes méthodes contiennent le mot "Date", qui de plus fait penser que tu retournes une NSDate (et non une NSString).
    Le nom doit refléter ce que tu demandes à  ton objet NSDate : sa représentation sous forme de chaà®ne, adaptée pour SQL ou pour le filesystem. d'où des noms comme "SQLString" ou "FilesystemRepresentation"
  • FKDEVFKDEV Membre
    04:20 modifié #8
    En revanche, quand on fait une catégorie, il faut quand même inclure le fichier header si on veut éviter un warning, non ?
  • muqaddarmuqaddar Administrateur
    04:20 modifié #9
    @Ali

    Je suis d'accord avec toi sur le fond mais il manque quand même la notion de GMT dans le nom des méthodes car c'est presque le plus important.

    Je verrai donc plutôt :

    - stringFileSystemRepresentationInGMT
    - stringRepresentationForSqlInGMT

    D'autre part, ma catégorie s'appelle :

    @interface NSDate (GMTCategory)

    car c'est GMT le "coeur de cible". What else ?
  • muqaddarmuqaddar Administrateur
    04:20 modifié #10
    dans 1276768128:

    En revanche, quand on fait une catégorie, il faut quand même inclure le fichier header si on veut éviter un warning, non ?


    Oui. Moi je l'ai mis dans le fichier .pch.
  • Nebuchad34Nebuchad34 Membre
    04:20 modifié #11
    Muqqadar, vous me copierez 100 fois "Toujours penser aux catégories"  >:)

    Le jour où j'ai découvert les catégories, ma vie a basculé  ;D

    Il y a des fonctions dont on se demande comment Apple a pu faire pour ne pas les implémenter, et c'est tellement pratique de pouvoir se les créer sans sous-classer.
    Du genre [NSString stringWithInt:(NSInteger)int] au lieu de tout le bordel de stringWithFormat: à  chaque fois.

    En ce qui concerne les noms de méthode dans les catégories (et pas uniquement d'ailleurs), j'essaye toujours de me poser la question "Et si Apple avait implémenté cette méthode, comment l'aurait-elle appelée?".
  • muqaddarmuqaddar Administrateur
    juin 2010 modifié #12
    dans 1276787239:

    Muqqadar, vous me copierez 100 fois "Toujours penser aux catégories"  >:)


    Je peux le copier avec une boucle ?  :P

  • Nebuchad34Nebuchad34 Membre
    04:20 modifié #13
    :D
Connectez-vous ou Inscrivez-vous pour répondre.