2016-07-20 21 views
0

Ich bin neu in der IOS-Entwicklung, so dass ich wahrscheinlich nur ein paar Grundlagen fehlt. Habe schon seit 2 Tagen mit diesem Problem gekämpft. Also, hier ist es. Ich habe eine Daten Aufgabe in meiner API-Klasse:Antwort von Async Block kann nicht mit AFNetworking 3.0

//request generation, putting url and dictionary into it 

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; 

NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { 
    if(!error) 
    { 
     self.jsonDictionary = responseObject; 
     NSInteger HTTPStatusCode = [(NSHTTPURLResponse *)response statusCode]; 
     NSLog(@"RESPONSE DATA: %@", self.jsonDictionary); 
     self.didSendRequest = YES; 
    } 
    else 
    { 
     self.didSendRequest = NO; 
     NSLog(@"ERROR: %@", error); 
    } 
}]; 
[dataTask resume]; 

Und dann das json Wörterbuch wie folgt abrufen:

-(NSDictionary *)returnJSON{ 
if(self.didSendRequest) return self.jsonDictionary; 
else NSLog(@"No dictionary dowloaded"); 
return self.jsonDictionary;} 

Dann in anderen Klasse übergeben i url und Wörterbuch auf die Daten-Task-Methode, und erhalten Antwort wie folgt aus:

-(NSDictionary*)userLogin : (NSString*)email : (NSString*) password { 
dataTaskClass* aph = [[dataTaskClass alloc] init]; 

NSDictionary *userParams = [[NSDictionary alloc] initWithObjectsAndKeys: 
          email,@"email", 
          password,@"password", 
          nil]; 
[aph postRequest: @"myUrl"]; 
return dataTaskClass.returnJSON;} 

und dann endlich ich nenne es in meiner view-Controller-Klasse wie folgt aus:

,

Also, yeah, wie Sie sehen können, rufe ich eine Methode, die dann die Download-Aufgabe asynchron ausführt, und danach überprüfe ich sofort den Rückgabewert, der natürlich "null" ist. Also, wie synchronisiere ich den Rückgabewert mit DataTask, oder überprüfen Sie die Fertigstellung auf andere Weise?

Bereits versucht die dumme "While-Schleife" und Semaphor-Ansatz, beide hängen den Haupt-Thread, wie erwartet. Versuchte etwas mit Benachrichtigungen, aber am Ende nichts.

Ich bin mir ziemlich sicher, dass es eine verdammt einfache Lösung hat, aber es nicht bekommen kann.

Würde mich für jede Hilfe freuen.

+0

Ich würde beginnen, indem Sie überprüfen, dass die URL tatsächlich eine gültige JSON-codierte Antwort mit tatsächlichen Daten zurückgegeben hat. Vielleicht muss die URL die Daten, die zurückgegeben werden sollen, in eine Protokolldatei schreiben. – DontKnow

+0

Nein, die URL ist in Ordnung. Ich habe vorher NSURLSession verwendet und einfach auf eine Antwort in einer while-Schleife gewartet. Das Problem war, dass NSURLSession Probleme mit der API hatte, die ich verwende, also musste ich zu AFnetworking wechseln. Jedenfalls ist die Verwendung von Completion Block die einzig richtige Antwort, denke ich. – briznichenko

Antwort

0

Ja, Sie vermissen einige Grundlagen.

Sie können keine Methode aufrufen, die asynchron arbeitet und die Antwort sofort erwartet. Die Lösung besteht darin, die Methode zum Abschließen eines Completion-Blocks zu schreiben. Dann übergeben Sie den Code, den Sie im Abschlussblock ausführen möchten. Der Methodenaufruf kehrt sofort zurück, bevor die Ergebnisse verfügbar sind, aber der Beendigungsblockcode wird aufgerufen, sobald der Download-Task abgeschlossen ist.

Ich schrieb eine SO-Antwort, die eine Beispiel-App enthalten, aber es ist in Swift geschrieben. Wenn Sie brandneue iOS-Entwickler sind und in Objective-C arbeiten, fällt Ihnen das vielleicht schwer.

Wenn Sie nur iOS-Entwicklung lernen, sollten Sie ernsthaft darüber nachdenken, Swift zu lernen. Apple macht deutlich, dass Swift die Zukunft für die iOS-Entwicklung ist. Learning Objective-C ist ebenfalls nützlich, aber ich würde vorschlagen, dass Sie sich auf Swift konzentrieren.

+0

Danke. Fragte meinen Mentor die gleiche Frage heute - die Antwort war die gleiche. Also ist das Lernen von Abschlussblöcken meine nächste Station. Also werde ich einige ernsthafte Refactoring tun müssen, denke ich. Danke nochmal! – briznichenko