2014-05-22 1 views
0

Actuellement, je comprends que je ne peux pas définir des variables de propriété dans une méthode de classe.Définition de variables de propriété dans les méthodes de classe

Par exemple:

#ISUser.h 

@interface ISUser : NSObject 
@property (nonatomic, retain) NSString *username; 
@property (nonatomic, retain) NSString *password; 
@property (nonatomic, retain) NSString *email; 
@property (nonatomic, retain) NSString *firstname; 
@property (nonatomic, retain) NSString *lastname; 

+ (void)logInWithUsernameInBackground:(NSString *)username 
          password:(NSString *)password 
           block:(ISUserResultBlock)block; 

@end 

Je cherche à travers le cadre de Parse et essaie de mieux comprendre comment mettre en œuvre une connexion comme ils l'ont fait. La méthode de classe (void)logInWithUsernameInBackground:password:block est où j'essaye d'assigner le nom d'utilisateur et le mot de passe de variables de propriété mais c'est un non.

Voici la mise en œuvre de la méthode actuelle:

+ (void)logInWithUsernameInBackground:(NSString *)username password:(NSString *)password block:(ISUserResultBlock)block 
{ 
    //self.username = username // Of course, I cannot do this 

    NSString *preferredLanguageCodes = [[NSLocale preferredLanguages] componentsJoinedByString:@", "]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@", kAPIHost, kAPIPath]]]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
    [request setValue:[NSString stringWithFormat:@"%@, en-us;q=0.8", preferredLanguageCodes] forHTTPHeaderField:@"Accept-Language"]; 
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
    NSData * data = [[NSString stringWithFormat: @"command=login&username=%@&password=%@", username, password] dataUsingEncoding: NSUTF8StringEncoding]; 
    [request setHTTPBody:data]; 

    ConnectionBlock *connection = [[ConnectionBlock alloc] initWithRequest:request]; 
    [connection executeRequestOnSuccess: ^(NSHTTPURLResponse *response, NSString *bodyString, NSError *error) { 
     block([self user], error); 
    } failure:^(NSHTTPURLResponse *response, NSString *bodyString, NSError *error) { 
     block([self user], error); 
    }]; 
} 

Dans le fichier Parse PFUser.h, ceci est une méthode de classe ... Mais comment donnent-ils les variables de propriété?

Je sais que les variables statiques peuvent être assignées/définies dans une méthode de classe mais j'aimerais accéder à ces variables d'une autre classe.

EDIT: Après avoir affiché le premier commentaire, la classe ISUser a déjà un singleton implémenté.

+ (instancetype)currentUser 
{ 
    static ISUser *sharedInstance = nil; 
    static dispatch_once_t oncePredicate; 
    dispatch_once(&oncePredicate, ^{ 
     sharedInstance = [[self alloc] init]; 
    }); 
    return sharedInstance; 
} 

Mais maintenant quoi? Je dois remplacer la méthode init et définir les variables? Mais comment la méthode init sait-elle à quoi attribuer les variables? Devrai-je ajouter des paramètres au + (instancetype)currentUser comme si + (instancetype)currentUser:username password:(NSString *)password puis surcharger la méthode init? + (instancetype)currentUser est une autre méthode de classe que j'ai extrait du framework PFUser.

+1

Vous pouvez utiliser une méthode de classe avec un motif singleton - le premier appel à 'logInWithUsernameInBackground' allouerait un objet et effectuer la connexion. Les appels ultérieurs utilisent l'objet existant et appellent simplement le bloc d'achèvement immédiatement - http://www.galloway.me.uk/tutorials/singleton-classes/ – Paulw11

Répondre

1

Vous ne pouvez pas définir de propriétés dans la méthode de classe. Vous pouvez le faire sur des méthodes d'instance. C'est parce que les propriétés sont pour les instances de la classe.

Dans la méthode de connexion parse, ils utilisent certaines propriétés comme paramètres de méthode et les utilisent pour le processus de connexion, mais ne les manipulent pas.

Hope it helps

Questions connexes