AFNetworking Request - Probleme mit der "Reihenfolge" der Ausgabe (Multithreading)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.12.2020 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

  • AFNetworking Request - Probleme mit der "Reihenfolge" der Ausgabe (Multithreading)

    Hi zusammen,

    ich bin am verzweifeln! Habe schon das halbe Internet durchforstet und sämtliche Codesnippets ausprobiert, doch komme einfach zu keinem richtigen Ergebnis ?( X(
    Die Abfrage vom Server funktioniert perfekt, durch [operation responseString] bekomme ich die Antwort und das benötigte XML, soweit so gut.

    Allerdings wo ich absolut keine weitere Ideen habe, ist der return des Strings, zu dem Zeitpunkt wo return [operation responseString]; ausgeführt wird, ist der string noch leer. Dies kommt daher das der Block in einem seperaten Thread ausgeführt wird, und der Compiler den Code weiter abarbeitet. Erst ein paar Millisekunden später ( im Schnitt ungefähr 15msek ) bekomm ich die Response: ( im Log: Response 123...)
    Wie kann ich dem mainThread sagen er soll warten bis er die Variable returned? :huh:
    Bzw. er soll die Variable erst returnen wenn sie gesetzt wurde! Mit warten ist ja so 'ne Sache ;)

    Ich bin auch für alle anderen Alternativen offen, auch komplett neue, ich brauch dies lediglich nur in dem getXML und mit einer User/Passwort Abfrage.

    Quellcode

    1. -(NSString*)getXML{
    2. NSString *string_baseurl = @"https://testdomain.com"; //Beispiel URL!
    3. NSString *string_url = [NSString stringWithFormat:@"%@/testpath/test.php",string_baseurl];
    4. AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:string_url]];
    5. [httpClient setParameterEncoding:AFFormURLParameterEncoding];
    6. [httpClient setAuthorizationHeaderWithUsername:string_benutzername password:string_passwort];
    7. NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST"
    8. path:string_url
    9. parameters:nil];
    10. AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    11. [httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]];
    12. [operation setAllowsInvalidSSLCertificate:NO];
    13. [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    14. // Print the response body in text
    15. NSLog(@"Response 123: %@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);
    16. } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    17. NSLog(@"Error: %@", error);
    18. }];
    19. [operation start];
    20. NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    21. // count can be anything you like
    22. [queue setMaxConcurrentOperationCount:2];
    23. if ([operation isFinished]) {
    24. [queue addOperation:operation];
    25. }
    26. [queue waitUntilAllOperationsAreFinished];
    27. NSLog(@"should be after 'Response 123'");
    28. return [operation responseString];
    29. }
    Alles anzeigen


    Vielen Dank schonmal
    Masel :thumbup:
  • macmoonshine schrieb:

    Warum verarbeitest Du das Ergebnis der nicht in dem entsprechenden Block?

    Sooo, habs nun hinbekommen, dank deines Hinweises :thumbsup:

    Für die, die wissen wollen wie:
    Den Codeausschnitt bei dem der responseString benötigt wird in eine extra Methode und die dann beim Block success aufgerufen mit String Übergabe. Die Welt kann so einfach sein :P

    Quellcode

    1. [operation setAllowsInvalidSSLCertificate:YES];
    2. [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    3. NSLog(@"[getXML] RESPONSE: %@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);
    4. [self parseXML:[operation responseString]];
    5. } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    6. NSLog(@"[getXML] ERROR: %@", error);
    7. }];
    8. [operation start];


    Vielen Dank :thumbup:
  • Masel schrieb:

    iOS-Boardmitteln ? Sagt mir jetzt nichts.

    Synchron ist simpel: developer.apple.com/library/io…OfURL:usedEncoding:error:

    Asynchron sind es ein paar Zeilen:

    Quellcode

    1. NSURLRequest *theRequest = [NSURLRequest requestWithURL:theURL];
    2. NSOperationQueue *theQueue = [NSOperationQueue mainQueue];
    3. [NSURLConnection sendAsynchronousRequest:theRequest queue:theQueue completionHandler:^(NSURLResponse *inResponse, NSData *inData, NSError *inError) {
    4. if(inData == nil) {
    5. // Fehler
    6. }
    7. else {
    8. // XML verarbeiten
    9. }
    10. }];
    Alles anzeigen

    Warum gibst Du dem XML-Parser nicht das NSData-Objekt?
    „Meine Komplikation hatte eine Komplikation.“