J'ai la classe suivante qui fait une demande de poste HTTP de manière asynchrone pour éviter des problèmes sur le thread principal de l'interface utilisateur:Comment revenez-vous d'un NSURLConnection asynchrone à la classe appelante?
@implementation DataFeeder
-(void) doLookup:(NSString *)inputValue
{
NSString *myRequestString = [NSString stringWithFormat:@"val=%@", inputValue];
NSMutableData *myRequestData = [ NSMutableData dataWithBytes: [ myRequestString UTF8String ] length: [ myRequestString length ] ];
NSURL * myUrl = [NSURL URLWithString: @"http://mywebsite/results.php"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: myUrl];
[request setHTTPMethod: @"POST"];
[request setHTTPBody: myRequestData];
[request setTimeoutInterval:10.0];
[[NSURLConnection alloc] initWithRequest:request delegate:self];
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
responseData = [[NSMutableData alloc] init];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[responseData appendData:data];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
// Show error message
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
// Use responseData
// Got all my response data here, so build up an object ready to send back
}
@end
J'invoque ce qui précède de mon ViewController
en utilisant la ligne de code suivante:
MyObject * myObj = [feeder doLookup:@"SomeStaticStringForNow"];
Alors, voilà comment je comprends:
- Le
doLookup
exécutera la demande sur une connexion asynchrone . - Lorsque les données ont été complètement chargé, il appellera
connectionDidFinishLoading
- Une fois les données a terminé le chargement, je bâtirai un objet à partir des données de réponse que je vais renvoyer au contrôleur d'appel
Comment puis-je écouter le contrôleur d'appel pour cela? Ai-je besoin d'implémenter mes propres méthodes de rappel dans le ViewController pour écouter l'invocation, puis arrêter un spinner et mettre à jour l'interface utilisateur en fonction du contenu de myObj
?
J'espère Theres une façon vraiment facile que j'ai négligé ...
Merci
Comment puis-je définir le 'delegate_', et plus important encore, où dois-je le définir? Vraisemblablement dans 'ViewController' quand je crée et initialise le' DataFeeder' avant l'utilisation? – Jimmy
Edited ma réponse, vérifiez-le. Rien d'autre, demandez. –
Parfait, ça m'a aidé! Pas tout à fait aussi élégant que les tâches Async dans Android mais bon ho. – Jimmy