2010-07-13 6 views
1

Je suis un expert complet de l'objectif-C, donc cela pourrait être une question très stupide pour beaucoup d'entre vous.iPhone Objective-C: combiner des méthodes ensemble

Actuellement, j'ai une vue avec un bouton 'SignIn', qui, quand on clique dessus, active un IBAction sigupUp que j'ai défini ci-dessous. Fondamentalement, cette méthode doit faire un appel JSON et récupérer des données sur l'utilisateur.

Ainsi, en ce moment, mon code ressemble à ceci:

-(IBAction)signIn:(id)sender{ 

//run registration API call 

//establish connection 
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
NSString *postLength = [NSString stringWithFormat:@"%d",[postData length]]; 

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.apicallhere.com/api/auth"]]]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Current-Type"]; 
[request setHTTPBody:postData]; 

[[NSURLConnection alloc]initWithRequest:request delegate:self]; 
responseData = [[NSMutableData data] retain]; 
} 
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{[responseData setLength:0];} 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{[responseData appendData:data];} 
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{/*NSLog(@"%@",error);*/} 

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{ 
NSString *response=[[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 
....code carries on from here. 
} 

Comme vous pouvez le voir, le problème avec mon code est que même si elle est initiée par la méthode « SignUp », il se termine par la méthode 'connectionDidFinishLoading'. Je veux avoir tout ce code dans une seule méthode. Pas 2 séparés, car je veux être en mesure de retourner un booléen vérifiant si la connexion a réussi ou non.

Si quelqu'un pourrait me dire comment coder cette procédure en une seule méthode, je l'apprécierais vraiment.

+0

s'il vous plaît formater le code, sinon, je ne vois rien – vodkhang

+0

* Je veux avoir tout ce code dans une seule méthode. Pas 2 séparés, comme je veux être en mesure de retourner un booléen vérifiant si la connexion a été réussie ou non. * En fait, vous pouvez penser que vous voulez cela, mais la première fois que vous obtenez un délai DNS en essayant de vous connecter, vous Je me rends compte que vous n'en voulez pas, et que personne d'autre ne le veut. Il serait préférable de maintenir un certain état dans votre application afin que vous sachiez à quel point vous avez obtenu avec le processus. Vous pouvez ensuite désactiver tous les contrôles sauf "annuler la connexion" jusqu'à ce que la connexion soit terminée. – JeremyP

Répondre

1

Si vous voulez vraiment le code tout en une méthode, vous parlez de bloquer potentiellement toute l'interface utilisateur et ainsi de suite sur une méthode de requête HTTP synchrone et un appel de réponse.

La méthode pour mettre tout cela "en ligne" est sendSynchronousRequest: returningResponse: erreur sur NSURLConnection

[NSURLConnection sendSynchronousRequest:returningResponse:error:] 

-à-dire

NSError *error; 
NSURLResponse *response; 
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
... do something with the NSURLResponse to enjoy with your data appropriately... 

Personnellement, je vous encourage à regarder une alternative pour la plupart de ces sorte de chose vers les méthodes asynchrones.

+0

Dans votre nom de sélection, il vous manque un deux-points, juste pour plus de clarté. Devrait être: 'sendSynchronousRequest: returnResponse: erreur:' le deux-points est important. Essayez et exécutez le sélecteur sans elle, et vous obtiendrez une erreur :) – jer

+0

Merci pour la prise - mis à jour! – heckj

Questions connexes