2010-05-26 3 views
0

J'ai une classe qui contient plusieurs objets utilisateur et en tant que tel a un tableau d'entre eux comme une variable d'instance:propriété @dynamic a besoin setter avec plusieurs comportements

NSMutableArray *users; 

La partie la plus délicate est l'activation. Je désérialise ces objets à partir d'un serveur via Objective Resource, et pour des raisons backend, les utilisateurs ne peuvent être renvoyés que sous la forme d'une longue chaîne d'UID - ce que j'ai localement est un dictionnaire séparé d'utilisateurs avec UID. Compte tenu de la chaîne uidString séparés par des virgules UIDs-je remplacer le dispositif de réglage par défaut et remplir les objets réels des utilisateurs:

@dynamic users; 
- (void)setUsers:(id)uidString { 
    users = [NSMutableArray arrayWithArray: 
       [[User allUsersDictionary] objectsForKeys:[(NSString*)uidString componentsSeparatedByString:@","]]]; 
} 

Le problème est le suivant: Je sérialiser maintenant ces à la base de données en utilisant SQLitePO, qui stocke ces derniers comme le tableau de objets utilisateur, pas la chaîne d'origine. Donc, quand je le récupère de la base de données, le setter traite ce tableau d'objets utilisateur comme une chaîne! Où je veux réellement ajuster le comportement du setter quand il obtient cet objet de DB par rapport au réseau.

Je ne peux pas simplement rendre le getter sérialisable dans une chaîne sans déchirer un grand code qui référence ce tableau d'objets utilisateur, et j'ai essayé de détecter dans le setter si j'ai une chaîne ou un tableau entrant:

if ([uidString respondsToSelector:@selector(addObject)]) { 
     // Already an array, so don't do anything - just assign users = uidString 

mais pas de succès ... donc je suis coincé - des suggestions? Merci d'avance!

Répondre

2

La solution que vous avez essayé est pas tout à fait tort, mais devrait ressembler à ceci:

if ([uidString respondsToSelector:@selector(addObject:)]) { 
    // Already an array, so don't do anything - just assign users = uidString 

Semble que vous avez forggoten sur le « : » - le addObject prend un paramètre après tout.

Cependant, la bonne façon de faire est de vérifier la classe d'objet passé:

if ([uidString isKindOfClass[NSArray class]]) 

Hope this utile,

Cheers, Pawel

+0

Merci Pawel - cela fonctionne maintenant en utilisant votre deuxième suggestion. Pour votre deuxième suggestion, j'ai d'abord essayé (en noob) si ([classe uidString] == [classe NSString]) ne réalisant pas "isKindOfClass" est la bonne façon – ambertch

1

Il serait beaucoup moins confus - et plus en ligne avec le style Cocoa habituel - si vous laissez le setter prendre un NSArray ou un NSMutableArray:

- (void)setUsers:(NSArray*)usersArray { ... } 

... et ont une autre méthode, dire -setUsersFromUidString:, en prenant un paramètre NSString, pour le premier cas:

- (void)setUsersFromUidString:(NSString*)uidString { ... } 

Votre approche originale perd l'avantage de l'auto-documentation Objective-C a et va dérouter les utilisateurs de la classe.

+0

Merci pour le conseil de style, je vais garder cela à l'esprit! – ambertch

Questions connexes