J'ai également ce problème, fonctionnant sur un appareil iOS 8. Il est détaillé ici et semble être un cas où iOS essaie d'utiliser des connexions qui ont déjà expiré. Mon problème n'est pas le même que le problème Keep-Alive expliqué dans ce lien, mais il semble être le même résultat final.
J'ai corrigé mon problème en exécutant un bloc récursif chaque fois que je reçois une erreur -1005 et cela fait que la connexion finit par passer même si parfois la récursivité peut boucler plus de 100 fois avant que la connexion fonctionne, mais cela n'ajoute qu'une seconde à l'exécution fois et je parie que c'est juste le temps qu'il faut au débogueur pour imprimer les NSLog pour moi.
Voici comment j'exécute un bloc récursif avec AFNetworking: Ajoutez ce code à votre fichier de classe de connexion
// 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); };
}
Ensuite, utilisez-le comme ceci:
+ (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);
}
Vous verrez que j'utilise une AFHTTPRequestOperation
sous - classe mais ajoutez votre propre code de demande. La partie importante appellerecurse(@offset.intValue+1));
pour que le bloc soit rappelé.