2013-10-30 3 views
18

Mit der neuen NSURLSession gibt es jetzt ein timeoutIntervalForRequest für das NSURLSessionConfiguration-Objekt, das zum Erstellen der Sitzung verwendet wurde.NSURLSessionConfiguration timeoutIntervalForRequest vs NSURLSession timeoutInterval

Es gibt jedoch noch ein timeoutInterval für das NSURLRequest-Objekt, das zum Erstellen der NSURLSessionTask in der Sitzung verwendet werden kann.

Meine Frage ist, wenn die Konfiguration eine timeoutIntervalForRequest auf 30 gesetzt hat, aber die NSURLRequest verwenden, um die Aufgabe zu erstellen hat ein timeoutInterval von 60, welches Timeout-Intervall tatsächlich verwendet wird?

Antwort

17

Wie meine Untersuchung auf iOS 7.0.3, timeoutInterval für NSURLRequest erhält keine Auswirkungen, wenn es mit NSURLSession verwendet wird.

Ob timeoutIntervalForRequest für NSURLSessionConfiguration oder nicht, timeoutInterval wird einfach ignoriert.

Sie können meine kleine Beispielanwendung NetworkTimeoutSample verwenden, um dieses Verhalten zu überprüfen.

Wenn Sie 1 für "URLReq" Feld, die timeoutInterval für NSURLRequest betrifft, dann klicken Sie auf "NSURLSession With URLRequest" -Taste, Ihre Sitzung wird nicht Timeout-Fehler erhalten.

Sie können auch erkennen, sollten Sie timeoutIntervalForResource, statt timeoutIntervalForRequest für NSURLSession gesetzt, wenn Sie gleiche Timeout Effekt für timeoutInterval von NSURLRequest bekommen möchten.

Wenn Sie sowohl den Wert timeoutIntervalForRequest als auch den Wert timeoutIntervalForResource für NSURLSessionConfiguration festlegen, wirkt sich dies auf einen kleineren Wert aus (dieses Verhalten unterscheidet sich vom aktuellen API-Dokument).

Es gibt keine Dokumentation zu diesen Spezifikationen, daher könnte es in zukünftigen iOS-Versionen geändert werden.

+0

Hallo, deine Antwort schickt mich in die richtige Richtung. Mir wurde klar, dass timeoutIntervalForRequest und timeoutIntervalForResource verwendet werden sollten. Allerdings kann ich anscheinend nie sehen, dass Callbacks nach der Zeitüberschreitung bei der Verwendung von NSURLSessionDownloadTask im Hintergrund aufgerufen werden. Welcher Callback wird bei Ihnen mit Timeout gestartet? Ist es noch URLSession: Aufgabe: didCompleteWithError:? –

+0

Ok, es sieht aus wie es funktioniert, wenn keine Hintergrundsitzungen verwendet werden ... Aber funktioniert nicht, wenn Hintergrundsitzungen verwendet werden ... –

+0

Ich möchte das Auszeitintervall meiner Webdienste 180 Sekunden (3 min) sein. Seit ich gelesen habe über NSURLSESSION und seine timeoutIntervalForRequest und timeoutIntervalForResource, versuchte ich mit diesen, was wiederum die gleichen Ergebnisse wie timeOutInterval von NSMutableURLRequest.ie ergab, ich setze ein Timeout-Intervall von 180 Sekunden wie sessionConfig.timeoutIntervalForRequest = 180.0; sessionConfig.timeoutIntervalForResource = 180.0; aber ich erhalte einen Fehler in 75 Sekunden oder in einem zufälligen Zeitintervall, indem ich sage "Die Anfrage ist abgelaufen". Hast du eine Idee dazu? – XiOS

4

Seit iOS8 ruft die NSUrlSession im Hintergrundmodus diese Delegate-Methode nicht auf, wenn der Server nicht antwortet. -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error Der Download/Upload bleibt auf unbestimmte Zeit im Leerlauf. Dieser Delegat wird auf iOS7 mit einem Fehler aufgerufen, wenn der Server nicht antwortet.

Im Allgemeinen schlägt eine NSURLSession-Hintergrundsitzung eine Aufgabe fehl, wenn auf der Leitung etwas schief geht. Vielmehr sucht es weiterhin nach einer guten Zeit, um die Anfrage und die Versuche zu dieser Zeit auszuführen. Dies wird fortgesetzt, bis das Ressourcen-Timeout abläuft (dh der Wert der timeoutIntervalForResource-Eigenschaft im NSURLSessionConfiguration-Objekt, das Sie zum Erstellen der Sitzung verwenden). Der aktuelle Standardwert für diesen Wert ist eine Woche! Mit anderen Worten, das Verhalten von fehlgeschlagen für ein Timeout in iOS7 war falsch. Im Kontext einer Hintergrundsitzung ist es interessanter, aufgrund von Netzwerkproblemen nicht sofort zu versagen. Seit iOS8 wird der Task NSURLSession fortgesetzt, selbst wenn Timeouts und Netzwerkverluste auftreten. Es wird jedoch fortgesetzt, bis timeoutIntervalForResource erreicht ist.

Also im Grunde funktioniert timeoutIntervalForRequest nicht im Hintergrund Sitzung aber TimeoutIntervalForResource wird.

Ich habe diese Antwort von einem der Mitglieder von Apple Staff unter developer forum. Auch das habe ich durch Umsetzung verifiziert.

+1

Ich benutze NSURLSession, um zu überprüfen, ob eine gegebene URL noch aktiv oder defekt ist, jede Empfehlung, zu welcher Zeit ich 'timeoutIntervalForResource' einstellen sollte? Mein Ziel ist es, es so einzustellen, dass es die absolute Mindestzeit ist, die benötigt wird, um festzustellen, ob die URL aktiv ist oder nicht? – GarySabo

+1

Wenn ich in meinen Experimenten "timeoutInterval" auf etwa 15 Sekunden für "NSURLRequest" und "NSURLSession" auf eine Hintergrundsitzung einstelle, wird iOS immer wieder versuchen, ca. alle 15 Sekunden, bis 'timeoutIntervalForResource' erreicht ist. Es passiert natürlich, wenn iOS denkt, dass Ihr Netzwerk gut ist. Kein Rückruf wird angerufen - es ist wahr. Getestet unter iOS 9.2/ –

+0

@GarySabo: Ich denke, dafür sollten Sie das Erreichbarkeitsmodul verwenden. –

2

Sieht so aus, als hätten sich die Dinge geändert, seit n-miyo es getestet hat.

Die apple documentation besagt, dass der NSURLRequest-Wert die Sitzungskonfiguration überschreibt.

In some cases, the policies defined in this configuration may be overridden by policies specified by an NSURLRequest object provided for a task. Any policy specified on the request object is respected unless the session’s policy is more restrictive. For example, if the session configuration specifies that cellular networking should not be allowed, the NSURLRequest object cannot request cellular networking.