zwingen NSUrlConnection-timeout auf einen synchronen Aufruf

Ich bin mir bewusst, Diskussionen über die nsurlconnection auf ios, und dass es ein minimum von 240 Sekunden ein timeout. Meine Frage ist, wenn ich sende dir ein synchroner Aufruf mittels NSURLConnection s + (NSData *)sendSynchronousRequest:(NSURLRequest )Anfrage returningResponse:(NSURLResponse *)response error:(NSError **)error, gibt es eine Möglichkeit, ich kann hier Abbrechen, bevor der 240 Sekunden ist? Ich bin am überlegen vielleicht die Einstellung eines Timers zum Abbrechen dieses synchrone Anforderung, aber ich bin mir nicht einmal sicher, ob es überhaupt möglich ist? Ich denke:

[self performSelector:@selector(cancelRequest:) withObject:myRequest afterDelay:myTimeOut];

Ich habe das Gefühl, das kann in einer Katastrophe enden, wenn irgendwie die Anforderung freigegeben wurde, und ich hätte keine Möglichkeit festzustellen, dass. Gedanken? Hat jemand versucht, dies zu tun? Dies ist ein synchrone nennen.

  • Für alle, die sich hier für eine Lösung, ich habe eine vorläufige ein. Hier ist was Sie tun können: Erstellen Sie einen timer und stellen Sie SICHER, Sie planen es für NSRunLoopModeCommon. Dann erstellen Sie Ihre NSURLConnection und planen es in den oben genannten run-loop-Modus. Wenn entweder die Verbindung gibt oder timer feuert, ein flag zu setzen. Ihr busy-loop sollte fangen und beenden. Beachten Sie, dass mindestens ein thread damit beschäftigt, Spinnerei während dieses Prozesses, so müssen Sie sicherstellen, dass dieser thread NICHT der Haupt-thread. Ich werde nach einem code-Beispiel, wenn ich mehr Zeit habe. Planung der Ausführung von Schleifen ist SEHR WICHTIG für diese Arbeit!
  • Das kann nicht funktionieren. Erste, Sie können nicht planen, eine synchrone Anforderung für jeder Schleife können Sie nur tun, dass mit asynchronen Anfragen, synchrone Anfragen einfach blockieren was auch immer-thread macht den call--und es ist eine Klasse Methode, nicht eine Instanz-Methode. Zweite, NSURLRequest gar nicht auf irgendetwas reagieren, wie cancelRequest:. Sie können nicht senden jede Art von cancel-Nachricht an einen NSURLRequest, Ihre app stürzt.
  • hmm, das ist nicht die Annullierung einer NSURLRequest obwohl-vielleicht sollte ich das expliziter. Es ist die Annullierung einer NSURLConnection. Ich sage nicht, dass die Verbindung sollte synchron sein, nur, dass es erscheint syncrhonous aus der Sicht der Anrufer. Dies bedeutet, dass eine asynchrone Anforderung, blockiert der thread, und Kündigung aus einem anderen thread. Ist das immer noch unmöglich?
  • Das ist nicht unmöglich, aber es ist kein Grund um den thread zu blockieren. Nur brechen Sie Ihren code, um zu tun, was Sie benötigen, bevor Sie den Anruf, stellen die asynchronen Aufruf und dann tun Sie, was Sie brauchen, wenn es fertig ist. Aus dieser Perspektive betrachtet, stornieren können Sie es leicht. Wenn Sie brauchen, um blockieren der Benutzeroberfläche Sie können mit einer Abschirmung Blick und ein spinner oder sowas, aber nicht blockieren den thread.
  • Und auch nur, wenn Sie absolut nicht anrufen können +sendSynchronousRequest:returningResponse:Fehler: -- wenn Sie anrufen, dass die Methode, die Sie nicht Abbrechen, egal was Sie versuchen.
InformationsquelleAutor Ying | 2011-03-01
Schreibe einen Kommentar