Ich erstelle eine NSMutableRequest
:NSURLSessionDataTask Timeout nachfolgende Anfragen andernfalls
self.req = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10.0];
Der Timeout eingestellt ist 10 Sekunden zu sein, weil ich der Benutzer nicht will, zu lange warten, um ein Feedback zu bekommen. Danach erstelle ich ein NSURLSessionDataTask
:
NSURLSessionDataTask *task = [self.session dataTaskWithRequest:self.req completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSHTTPURLResponse * httpResp = (NSHTTPURLResponse *)response;
if (error) {
// this is where I get the timeout
}
else if (httpResp.statusCode < 200 || httpResp.statusCode >= 300) {
// handling error and giving feedback
}
else {
NSError *serializationError = nil;
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&serializationError];
}
[task resume];
}
Das Problem ist der Server geht in Gateway-Timeout und es braucht viel Zeit. Ich bekomme den Timeout-Fehler und ich gebe dem Benutzer eine Rückmeldung, aber alle folgenden API-Aufrufe scheitern auf Grund eines Timeout-Fehlers auf die gleiche Weise. Der einzige Weg, um es zu stoppen, ist die App zu töten und neu zu beginnen. Gibt es etwas, was ich tun sollte, um die Aufgabe oder die Verbindung nach einem Timeout-Fehler zu beenden? Wenn ich kein Timeout einstelle und ich warte bis ich den Fehlercode vom Server bekomme funktionieren alle folgenden Anrufe einwandfrei (aber der User wartet sehr!).
Ich habe versucht, um die Aufgabe abzubrechen:
NSURLSessionDataTask *task = [self.session dataTaskWithRequest:self.req completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSHTTPURLResponse * httpResp = (NSHTTPURLResponse *)response;
if (error) {
// this is where I get the timeout
[task cancel];
}
...
[task resume];
}
Ich denke, könnten Sie benötigen die 'self.req' neu zu initialisieren, wenn ein Fehler/timeout ist. Bin mir aber nicht sicher. – Mrunal
versuchen Sie, die Verbindungen mit der POSTMAN App in Chrome aufzurufen, und sehen Sie, ob Sie immer noch den Timeout-Fehler erhalten oder nicht –
Erstellen Sie diese Aufgabe in einem Block? Oder ein anderer Thread als der Haupt-Thread? –