So stornieren Sie eine asynchrone NSURLConnection
Aufrufen von Instanz-Methode Abbrechen, auf eine NSURLConnection die meisten oft nicht, Abbrechen der Verbindung überhaupt.
Ich bin der Durchführung einer asynchronen NSURLConnection in eine NSOperation. Wenn der Vorgang abgebrochen wird, wird die Verbindung beendet durch Aufruf von cancel auf NSURLConnection und dann wird die Verbindung zum nil.
Gibt es eine Möglichkeit, um die Verbindung zu beenden sofort? Meistens ist es weiterhin im hintergrund ausgeführt, bis die Anforderung abgeschlossen ist, auch wenn die beiden die Verbindung ist abgebrochen, und setzen Sie zu null. Die NSOperation Unterklasse ist dealloced, nachdem die Verbindung abgebrochen ist, die Verbindung ist freigegeben. Sogar nach, dass die asynchrone Verbindung läuft weiter!
Gibt es eine andere Möglichkeit es zu kündigen? Oder kann der thread seinen Betrieb auf abgebrochen werden?
Hier ist ein Codeausschnitt aus meinem NSOperation Unterklasse main-Methode:
//Create and start asynchronous connection
self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
[request release];
while(!isFinished) {
if(self.isCancelled) {
[self.connection cancel];
self.connection = nil;
[self uploadCanceledDelegate];
return;
}
//Special sleep because callbacks are executed on same thread as this loop
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
HINWEIS: Dieses Verhalten nur auftreten, wenn WiFi aktiviert ist. Mit 3G/Edge/GPRS funktioniert es einwandfrei
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte dies ein problem mit der Apple-Dokumentation.
Ist es möglich, dass der Anschluss wartet derzeit in einem gesperrten thread, und es gibt nichts, das OS wird sofort tun, während dieser thread gesperrt. Der thread wird nicht wirklich abgebrochen werden, bis es wieder entsperrt zu einem späteren Zeitpunkt. Deshalb sollten Sie nicht lassen Sie alle Objekte, die Handhabung der stornierten verbindungen bis zu einem unbekannten Zeitpunkt in der Zukunft, wenn der socket, auf dem der thread wartet auf Timeout oder geschlossen ist.
Falls Sie irgendwelche Lecks oder abstürzt, können Sie versuchen, das verschieben der "stornierten" operation Objekte zu einer anderen Warteschlange von Sachen, die darauf warten, veröffentlicht ein paar Sekunden oder vielleicht sogar Minuten später.
Ich hatte das gleiche problem bei der Verwendung von Lazy image loading (Asynchrone Bild laden) was ich gemacht habe gespeichert, alle meine NSURLRequests in einem NSMUtable array und wenn ich Abbrechen müssen alle diese habe ich durch eine for-Schleife.
Dafür könnte sein, dass Sie diese stornieren einer Nachricht und die message dispatcher kann der Versand der Meldung während der aktuellen Funktion in der while-Schleife. Ich hoffe, dass mein Verständnis von Objective-C-Nachrichten ist richtig hier, aber dies könnte funktionieren, wenn du die Funktion zu beenden und die Bearbeitung anderer cleanup-code in einem callback, der ausgelöst wird, wenn Ihr isFinished-flag gesetzt ist. Bin ich bereit, falsch sein, aber ich denke, das problem könnte die while-Schleife.