wake-up-neo.com

NSURLSession: Wie kann das Timeout für URL-Anfragen erhöht werden?

Ich verwende die neue NSURLSessionDataTask von iOS 7, um Daten wie folgt abzurufen:

NSURLSession *session = [NSURLSession sharedSession];

NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:
request completionHandler:
^(NSData *data, NSURLResponse *response, NSError *error) {
//
}];

Wie kann ich die Timeout-Werte erhöhen, um den Fehler "The request timed out" zu vermeiden (in NSURLErrorDomain Code = -1001)?

Ich habe die Dokumentation für NSURLSessionConfiguration geprüft, konnte aber den Timeout-Wert nicht festlegen.

Danke für deine Hilfe!

55
AlexR

ObjC

NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
sessionConfig.timeoutIntervalForRequest = 30.0;
sessionConfig.timeoutIntervalForResource = 60.0;

Schnell

let sessionConfig = URLSessionConfiguration.default
sessionConfig.timeoutIntervalForRequest = 30.0
sessionConfig.timeoutIntervalForResource = 60.0
let session = URLSession(configuration: sessionConfig)

Was sagen Dokumente?

timeoutIntervalForRequest und timeoutIntervalForResource geben das Timeout-Intervall für die Anforderung sowie die Ressource an.

timeoutIntervalForRequest - Das Zeitlimit, das beim Warten verwendet werden soll für zusätzliche Daten. Der diesem Wert zugeordnete Timer wird zurückgesetzt wann immer neue Daten ankommen. Wenn der Anforderungszeitgeber die .__ erreicht. angegebenes Intervall ohne neue Daten zu empfangen, löst es eine .__ aus. Auszeit.

timeoutIntervalForResource - Die maximale Zeit, die ein Ressourcenanforderung sollte zulässig sein. Dieser Wert steuert, wie lange warten, bis eine gesamte Ressource übertragen wurde, bevor sie aufgibt. Das Der Ressource-Timer startet, wenn die Anforderung initiiert wird, und zählt bis Entweder ist die Anforderung abgeschlossen oder dieses Zeitlimit ist erreicht. welches auch immer zuerst kommt.

Basierend auf NSURLSessionConfiguration-Klassenreferenz

91
RaffAl

Falls Swift-Entwickler hierher kommt

dazu müssen Sie verwenden

    let urlconfig = NSURLSessionConfiguration.defaultSessionConfiguration()
    urlconfig.timeoutIntervalForRequest = 12
    urlconfig.timeoutIntervalForResource = 12
    self.session = NSURLSession(configuration: urlconfig, delegate: self.delegates, delegateQueue: nil)
16
Sruit A.Suk

In Swift 3. Timeout 15 Sekunden.

    let configuration = URLSessionConfiguration.default
    configuration.timeoutIntervalForRequest = TimeInterval(15)
    configuration.timeoutIntervalForResource = TimeInterval(15)
    let session = URLSession(configuration: configuration)
8

NSURLSessionConfiguration enthält die Eigenschaft timeoutIntervalForRequest:

@property NSTimeInterval timeoutIntervalForRequest

um das Timeout-Intervall zu steuern. Es gibt auch timeoutIntervalForResource für das Timeout, nachdem die Anforderung initiiert wurde.

4
Wojtek Surowka

In Swift 3.0 müssen Sie verwenden

 if let cleanURLString = urlString.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed),
    let theURL: Foundation.URL = Foundation.URL(string: cleanURLString) {

    var task:URLSessionDataTask?
    let urlconfig = URLSessionConfiguration.default
    urlconfig.timeoutIntervalForRequest = 20
    urlconfig.timeoutIntervalForResource = 60
    let session = Foundation.URLSession(configuration: urlconfig, delegate: self, delegateQueue: OperationQueue.main)

    let request = URLRequest(url: theURL)
    request.httpMethod = "POST"
    request.cachePolicy = URLRequest.CachePolicy.reloadIgnoringCacheData
    request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
    let paramString = YourParameterString
    request.httpBody = paramString.data(using: String.Encoding.utf8)

    task = session.dataTask(with: request) {
        (data, response, error) in
        // Do here
    })
    dataTask.resume()
}
2
Lineesh K Mohan

Für Swift 4:

let config = URLSessionConfiguration.default
config.timeoutIntervalForRequest = TimeInterval(15)
config.timeoutIntervalForResource = TimeInterval(15)
let urlSession = URLSession(configuration: config)

TimeoutIntervalForRequest gilt für alle Tasks in Sitzungen, die auf dieser Konfiguration basieren. Die timeoutIntervalForResource ist für alle Tasks in Sitzungen, die auf dieser Konfiguration basieren.

1
user9060380

In meinem Fall erhöhte ich das Timeout der falschen Klasse. Mein Timeout-Fehler wurde behoben, indem das Timeout der URLRequest nicht der URLSession erhöht wurde.

var request = URLRequest(url: url)
request.timeoutInterval = 30
0
Nico Dioso