Wie kehre ich von einer asynchronen NSURLConnection zur aufrufenden Klasse zurück?
Ich habe die folgende Klasse, die eine HTTP-Post-Anfrage asynchron macht, um Probleme im Haupt-UI-Thread zu vermeiden:
@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
Ich rufe das Obige von meinem anViewController
Verwenden Sie die folgende Codezeile:
MyObject * myObj = [feeder doLookup:@"SomeStaticStringForNow"];
So verstehe ich das also:
DasdoLookup
führt die Anfrage auf einer asynchronen Verbindung aus.Wenn die Daten vollständig geladen wurden, wird sie aufgerufenconnectionDidFinishLoading
Sobald die Daten geladen wurden, baue ich aus den Antwortdaten ein Objekt auf, das ich an den aufrufenden Controller zurücksendeWie kann ich den anrufenden Controller abhören lassen? Muss ich im ViewController meine eigenen Callback-Methoden implementieren, die auf den Aufruf warten und dann einen Spinner stoppen und die Benutzeroberfläche basierend auf dem Inhalt von aktualisieren?myObj
?
Ich hoffe, dass es einen wirklich einfachen Weg gibt, den ich übersehen habe ...
Vielen Dank