2010-12-28 11 views
0

Ich schreibe eine iPhone App, die eine Webservice-Methode mit Soap-Nachrichtenformat aufrufen wird. Ich brauche einen synchronen Prozess, weil die Tabellenansicht diese Daten benötigt, bevor sie angezeigt werden können. Also benutze ich [NSURLConnection sendSynchronousRequest: returningResponse: Fehler:]NSURLConnection synchrone Problem

Das Problem ist, das ganze Programm wird ohne Fehlermeldung nach dem Methodenaufruf beendet. Auch ich NSLog Aussage legte kurz nach dem [NSURLConnection sendSynchronousRequest: returningResponse: Fehler:], es gibt keine jede Ausgabe so bin ich das Programm verlassen während dieser Methodenaufruf sicher. Eigentlich während , dass HTTP-Anfrage und Antwort Zeug.

Wenn ich jedoch einen Breakpoint vor diesem Methodenaufruf setzen und das Programm im Debug-Modus ausführen, läuft alles gut, das Programm wird nicht beendet, und ich habe meine Ergebnisse auch.

Kann jemand herausfinden, was vor sich geht? Danke.

- (void) sendSyncHTTPRequest:(NSString *)request_data operation:(ServOperationSync *)serv_ops { 
id<ServiceData> serv_data = serv_ops.dataDelegate; 
NSURL *urlAddr = [NSURL URLWithString:[serv_data getServURL]]; 

urlRequest = [NSMutableURLRequest requestWithURL:urlAddr 
            cachePolicy:NSURLRequestReloadIgnoringLocalCacheData 
           timeoutInterval:90]; 
NSData *requestData = [request_data dataUsingEncoding:NSUTF8StringEncoding]; 
[urlRequest setValue:@"MobilePortal" forHTTPHeaderField:@"User-Agent"]; 
[urlRequest setValue:[serv_data getSoapAction] forHTTPHeaderField:@"SOAPAction"]; 
[urlRequest setValue:[NSString stringWithFormat:@"%u", [requestData length]] forHTTPHeaderField:@"Content-Length"]; 
[urlRequest setValue:urlAddr.host forHTTPHeaderField:@"Host"]; 
[urlRequest setHTTPMethod:@"POST"]; 
[urlRequest setHTTPBody:requestData]; 

NSLog(@"just before sending http request"); 
[serv_ops.responseData setData:[NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&urlResponse error:&urlError]]; 
NSLog(@"after sending http request"); 

}

Beachten Sie, dass urlResponse und urlError als Instanzvariablen deklariert.

+0

Ich habe mehr Informationen darüber. Wenn ich das Programm ausführen, und ich drücke die "Pause" aus der Konsolen-Symbolleiste, und das Programm fortsetzen, alle Dinge sind gut, ich bekomme das Ergebnis. Wenn ich das Programm ausführen, nichts tun und es laufen lassen, wird das Programm ohne irgendwelche Nachrichten beendet. So scheint es, als ob das Programm nicht in einem eigenen Prozess oder Thread ausführen kann, Schleife oder was? Ich bin nicht sicher, weil ich keine Angelegenheit denke, wenn ich das Programm im Debug-Modus oder Pause führen Sie es dann wieder aufnehmen, lege ich eigentlich das Programm Prozess zu anderen oder was, wie süchtig nach GDB? Alle Informationen werden geschätzt. – user556623

+0

Sind Sie sicher, dass NSURLConnection der Grund für Ihren Absturz ist ?! –

Antwort

0

Sie benötigen:

  • eine Laufschleife auf Ihrem Code
  • und vergessen Sie nicht Ihre NSURLConnection Delegierten
+0

Hallo, Neilvert, danke für deine Antwort. Wollen Sie sagen, ich brauche asynchrone, weil synchrone keinen Delegate-Parameter zur Verfügung stellt.Ich frage mich nur, wie man asynchron verwendet, um zu erreichen, was ich will, nämlich zu verhindern, dass die leere Tabellenansicht auftaucht. Ich denke, ich muss den Thread immer noch auf irgendeine Weise blockieren, und ist das nicht genau das, was synchron tut? – user556623

3

Sie haben uns nicht bieten genug Code, um herauszufinden, warum Ihr App verhält sich nicht korrekt.

Mit [NSURLConnection sendSynchronousRequest:returningResponse:error:] ist generell eine schlechte Idee, weil es den aktuellen Thread blockiert. Sie rufen es wahrscheinlich vom Hauptthread ab, dies wird die Benutzeroberfläche blockieren. Die App reagiert nicht auf Berührungen und fühlt sich wie eingefroren an, wenn die Anfrage lange dauert (besonders bei Verbindungen mit geringer Bandbreite wie EDGE).

Die Art der Vernetzung ist asynchron. Daher rate ich Ihnen, stattdessen eine asynchrone Anfrage zu machen oder GCD zu verwenden. Aktualisieren Sie die Tabellenansicht in Delegatmethoden (Verbindung: didReceiveData: usw.). Sie können die Tabellenansichtsdaten in einer NSMutableArray speichern und nach der Änderung des Arrays [tableView reloadData] aufrufen. Die Tabellenansicht würde dann aus diesem Array in den Delegiertenmethoden UITableViewDataSource erstellt werden.

+0

Ich bin sicher, dass [NSURLConnection sendSynchronousRequest: returningResponse: error:] das Problem verursacht. Dies liegt daran, dass ich einen NSLog direkt davor platziert habe und direkt danach kann der erste angezeigt werden und der letztere wird die Nachricht nicht anzeigen. Eigentlich muss ich diese synchrone verwenden, denn wenn die App gestartet wird, rufe ich sie in der applicationDidFinishLaunching-Methode auf, ich brauche diese Daten, um die erste Ansicht in meiner App zu füllen, die eine Tabellenansicht ist. Wenn ich einen asynchronen Weg benutze, erscheint das Fenster sofort und die leere Navigationsansicht und die Tabellenansicht werden angezeigt, was nicht gut ist. – user556623