Appeler une méthode depuis n'importe quelle classe
muqaddar
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 :
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).
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:@"yyyy-MM-dd HH:mm:ss"];<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).
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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 : 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] ?
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 ?
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
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
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"
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 ?
Oui. Moi je l'ai mis dans le fichier .pch.
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?".
Je peux le copier avec une boucle ? :P