Bir iOS 8 cihazında da çalışıyorum. Bu biraz daha ayrıntılı olarak burada ve zaten zaman aşımına uğramış bağlantılarını kullanmaya çalışmaktan iOS vakası gibi görünüyor. Benim sorunum bu bağlantıda açıklanan Keep-Alive sorunu ile aynı değil, ancak aynı sonuç gibi görünüyor.
-1005 hatası aldığımda özyinelemeli bir blok çalıştırarak sorunumu düzelttim ve bağlantı çalışmadan önce bazen özyineleme 100+ kez dönebilse bile bağlantı sonunda gerçekleşir, ancak yalnızca çalıştırmaya sadece bir saniye ekler kez ve ben NSLog benim için yazdırmak için hata ayıklayıcı sadece zamanı.
AFNetworking ile özyinelemeli bir bloğu nasıl çalıştıracağım: Bu kodu bağlantı sınıfı dosyanıza ekleyin
// 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); };
}
Sonra bunu kullanın bunu kullanın:
+ (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);
}
Bir AFHTTPRequestOperation
alt sınıf kullandığımı ancak kendi istek kodunuzu eklediğimi göreceksiniz . Önemli recurse(@offset.intValue+1));
olan, bloğun tekrar çağrılmasını istiyor.