2013-10-30 13 views
18

Con la nuova NSURLSession, ora esiste un timeoutIntervalForRequest sull'oggetto NSURLSessionConfiguration utilizzato per creare la sessione.NSURLSessionConfiguration timeoutIntervalForRequest vs NSURLSession timeoutInterval

Ma c'è ancora un timeoutInterval sull'oggetto NSURLRequest che può essere utilizzato per creare NSURLSessionTask nella sessione.

La mia domanda è, se la configurazione ha un timeoutIntervalForRequest impostato su 30, ma NSURLRequest usa per creare l'attività ha un intervallo di timeout di 60, quale intervallo di timeout verrà effettivamente utilizzato?

risposta

17

Come la mia indagine su iOS 7.0.3, timeoutInterval per NSURLRequest non ottiene alcun effetto quando viene utilizzato con NSURLSession.

Se si impostaper NSURLSessionConfiguration oppure no, timeoutInterval viene semplicemente ignorato.

È possibile utilizzare la mia piccola applicazione di esempio NetworkTimeoutSample per verificare questo comportamento.

Quando si imposta 1 per il campo "URLReq", che interessa timeoutInterval per NSURLRequest, quindi fare clic sul pulsante "NSURLSession con URLRequest", la sessione non riceverà l'errore di timeout.

È inoltre può riconoscere è necessario impostare timeoutIntervalForResource, invece di timeoutIntervalForRequest per NSURLSession se si desidera ottenere lo stesso effetto di timeout per timeoutInterval di NSURLRequest.

Se si imposta sia il valore timeoutIntervalForRequest e timeoutIntervalForResource per NSURLSessionConfiguration, il valore inferiore sarà interessato (ritengo che questo comportamento sia diverso dal documento API corrente).

Non ci sono documentazione su tali specifiche, quindi potrebbe essere modificata sulla futura versione di iOS.

+0

Ciao, la tua risposta mi manda nella giusta direzione. Mi ha fatto capire che dovrebbe essere usato timeoutIntervalForRequest e timeoutIntervalForResource. Tuttavia, non riesco a vedere mai alcun richiamo richiamato dopo il ritardo di timeout quando si utilizza NSURLSessionDownloadTask in background. Con quale callback viene chiamato il timeout? E 'ancora URLSession: task: didCompleteWithError:? –

+0

Ok, sembra che funzioni quando non si usano sessioni in background ... Ma non funziona quando si usano sessioni in background ... –

+0

voglio che l'intervallo di timeout dei miei servizi web sia di 180 secondi (3 min). Perché ho letto su NSURLSESSION e il suo timeoutIntervalForRequest e timeoutIntervalForResource, ho provato a utilizzare questi, che hanno restituito gli stessi risultati di timeOutInterval di NSMutableURLRequest.ie, sto impostando l'intervallo di timeout di 180 secondi come sessionConfig.timeoutIntervalForRequest = 180.0; sessionConfig.timeoutIntervalForResource = 180.0; ma sto ricevendo la chiamata di errore in 75 secondi o in un intervallo casuale, dicendo "La richiesta è scaduta". Hai qualche idea su questo? – XiOS

4

Da iOS8, NSUrlSession in modalità background non chiama questo metodo delegato se il server non risponde. -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error Il download/caricamento rimane inattivo a tempo indeterminato. Questo delegato viene chiamato su iOS7 con un errore quando il server non risponde.

In generale, una sessione in background NSURLSession non fallisce un'attività se qualcosa va storto sul filo. Piuttosto, continua a cercare il momento giusto per eseguire la richiesta e riprova in quel momento. Questo continua fino alla scadenza del timeout della risorsa (ovvero, il valore della proprietà timeoutIntervalForResource nell'oggetto NSURLSessionConfiguration che si utilizza per creare la sessione). L'impostazione predefinita per quel valore è una settimana! In altre parole, il comportamento di non riuscire per un timeout in iOS7 era errato. Nel contesto di una sessione in background, è più interessante non fallire immediatamente a causa di problemi di rete. Quindi, dal momento che iOS8, l'attività NSURLSession continua anche se incontra timeout e perdita di rete. Continua tuttavia fino al raggiungimento di timeoutIntervalForResource.

Quindi fondamentalmente timeoutIntervalForRequest non funzionerà nella sessione di background ma timeoutIntervalForResource lo farà.

Ho ricevuto questa risposta da uno dei membri dello staff Apple allo developer forum. Inoltre, ho verificato ciò implementando.

+1

Sto utilizzando NSURLSession per verificare se un determinato URL è ancora attivo o danneggiato, qualsiasi suggerimento su che ora impostare "timeoutIntervalForResource" su? Il mio obiettivo è impostarlo in modo tale che sia il tempo minimo necessario per determinare se l'url è attivo o no? – GarySabo

+1

Nei miei esperimenti, se imposti 'timeoutInterval' su qualcosa come 15 secondi per' NSURLRequest' e 'NSURLSession' è una sessione in background, iOS continuerà a riprovare ca. ogni 15 secondi fino al raggiungimento di "timeoutIntervalForResource". Accadrà, ovviamente, se iOS pensa che la tua rete sia buona. Non si chiamerà callback, è vero. Testato su iOS 9.2/ –

+0

@GarySabo: Penso che per questo dovresti usare il modulo di raggiungibilità. –

2

Sembra che le cose siano cambiate da quando ne è stato testato n-miyo.

Il apple documentation indica che il valore NSURLRequer sostituirà la configurazione della sessione.

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.