Ich habe dieses Problem auch auf einem iOS 8-Gerät. Es ist etwas mehr detailliert hier und scheint ein Fall von iOS zu versuchen , Verbindungen zu verwenden , die bereits abgelaufen sind out. Mein Problem ist nicht dasselbe wie das in diesem Link erläuterte Keep-Alive-Problem, es scheint jedoch dasselbe Endergebnis zu sein.
Ich habe mein Problem behoben, indem ich einen rekursiven Block ausgeführt habe, wenn ich den Fehler -1005 erhalte. Dadurch wird die Verbindung schließlich durchgestellt, obwohl die Rekursion manchmal mehr als 100 Mal wiederholt werden kann, bevor die Verbindung funktioniert, jedoch nur eine Sekunde zum Ausführen hinzugefügt wird Ich wette, das ist genau die Zeit, die der Debugger benötigt, um die NSLogs für mich zu drucken.
So führe ich einen rekursiven Block mit AFNetworking aus: Fügen Sie diesen Code Ihrer Verbindungsklassendatei hinzu
// From Mike Ash's recursive block fixed-point-combinator strategy https://gist.github.com/1254684
dispatch_block_t recursiveBlockVehicle(void (^block)(dispatch_block_t recurse))
{
// assuming ARC, so no explicit copy
return ^{ block(recursiveBlockVehicle(block)); };
}
typedef void (^OneParameterBlock)(id parameter);
OneParameterBlock recursiveOneParameterBlockVehicle(void (^block)(OneParameterBlock recurse, id parameter))
{
return ^(id parameter){ block(recursiveOneParameterBlockVehicle(block), parameter); };
}
Dann benutze es so:
+ (void)runOperationWithURLPath:(NSString *)urlPath
andStringDataToSend:(NSString *)stringData
withTimeOut:(NSString *)timeOut
completionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
{
OneParameterBlock run = recursiveOneParameterBlockVehicle(^(OneParameterBlock recurse, id parameter) {
// Put the request operation here that you want to keep trying
NSNumber *offset = parameter;
NSLog(@"--------------- Attempt number: %@ ---------------", offset);
MyAFHTTPRequestOperation *operation =
[[MyAFHTTPRequestOperation alloc] initWithURLPath:urlPath
andStringDataToSend:stringData
withTimeOut:timeOut];
[operation setCompletionBlockWithSuccess:
^(AFHTTPRequestOperation *operation, id responseObject) {
success(operation, responseObject);
}
failure:^(AFHTTPRequestOperation *operation2, NSError *error) {
if (error.code == -1005) {
if (offset.intValue >= numberOfRetryAttempts) {
// Tried too many times, so fail
NSLog(@"Error during connection: %@",error.description);
failure(operation2, error);
} else {
// Failed because of an iOS bug using timed out connections, so try again
recurse(@(offset.intValue+1));
}
} else {
NSLog(@"Error during connection: %@",error.description);
failure(operation2, error);
}
}];
[[NSOperationQueue mainQueue] addOperation:operation];
});
run(@0);
}
Sie werden sehen, dass ich eine AFHTTPRequestOperation
Unterklasse verwende, aber Ihren eigenen Anforderungscode hinzufüge. Der wichtige Teil ist das Aufrufen recurse(@offset.intValue+1));
, damit der Block erneut aufgerufen wird.