Ich verwende iOS 7 neu NSURLSessionDataTask
, 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 zu vermeiden "The request timed out"
(in NSURLErrorDomain
Code = -1001
)?
Ich habe die Dokumentation für NSURLSessionConfiguration überprüft , aber keine Möglichkeit gefunden, den Zeitlimitwert festzulegen .
Danke für deine Hilfe!
ios
objective-c
swift
http
nsurlsession
AlexR
quelle
quelle
NSOperationQueue
mitmaxConcurrentOperationCount
) , einschränken . Dies ist nicht zu kompliziert, wenn Sie die nicht delegierte basierte Wiedergabe von verwendenNSURLSession
und die Abschlussblockwiedergaben verwenden. Aufgrund erheblicher Probleme mit derNSURLSession
Architektur ist es etwas schwierig, dies richtig zu machen, wenn der delegatenbasierte Ansatz verwendet wird.sharedSession
?defaultSessionConfiguration
und dietimeOutIntervalForRequest
für Ihren Server geeignete festlegen . Es ist nur so, dass die Zeitüberschreitungsprobleme, die sich aus der Ausgabe von mehr als vier oder fünf gleichzeitigen Anforderungen ergeben, ein völlig anderes Problem sind und eine andere Lösung vorschlagen. Wenn Sie jedoch nur ein oder zwei Anforderungen ausgeben und das Zeitlimit weiterhin überschritten wird, ist das Festlegen dertimeoutInterval
Eigenschaften der richtige Ansatz.Antworten:
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 die Dokumente sagen
timeoutIntervalForRequest
undtimeoutIntervalForResource
geben Sie das Zeitlimit für die Anforderung sowie die Ressource an.Basierend auf der NSURLSessionConfiguration-Klassenreferenz
quelle
sessionConfig.timeoutIntervalForRequest = 180.0; sessionConfig.timeoutIntervalForResource = 180.0;
aber ich erhalte einen Fehlerrückruf in 75 Sekunden oder in einem zufälligen Zeitintervall mit der Meldung "Die Anforderung ist abgelaufen". Hast du eine Idee dazu?[NSURLSessionConfiguration defaultSessionConfiguration]
nicht wirksam wird[NSURLSession sharedSession]
?timeoutIntervalForRequest
60 Sekunden und der Standardwert fürtimeoutIntervalForResource
7 Tage beträgt.Für den Fall, dass Swift-Entwickler hierher kommen
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)
quelle
In schnellem 3. Timeout 15 Sekunden.
let configuration = URLSessionConfiguration.default configuration.timeoutIntervalForRequest = TimeInterval(15) configuration.timeoutIntervalForResource = TimeInterval(15) let session = URLSession(configuration: configuration)
quelle
timeoutIntervalForRequest
undtimeoutIntervalForResource
.NSURLSessionConfiguration enthält die Eigenschaft timeoutIntervalForRequest:
@property NSTimeInterval timeoutIntervalForRequest
um das Timeout-Intervall zu steuern. Es gibt auch timeoutIntervalForResource für das Timeout nach dem Initiieren der Anforderung.
quelle
In meinem Fall habe ich das Timeout der falschen Klasse erhöht. Mein Timeout-Fehler wurde behoben, indem das Timeout der URLRequest und nicht der URLSession erhöht wurde
var request = URLRequest(url: url) request.timeoutInterval = 30
quelle
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() }
quelle
Für Swift 4:
let config = URLSessionConfiguration.default config.timeoutIntervalForRequest = TimeInterval(15) config.timeoutIntervalForResource = TimeInterval(15) let urlSession = URLSession(configuration: config)
Das timeoutIntervalForRequest gilt für alle Aufgaben in Sitzungen, die auf dieser Konfiguration basieren. Die timeoutIntervalForResource gilt für alle Aufgaben in Sitzungen, die auf dieser Konfiguration basieren.
quelle