Tôi cũng gặp vấn đề này, chạy trên thiết bị iOS 8. Đây là chi tiết một số chi tiết ở đây và dường như là một trường hợp iOS đang cố gắng sử dụng các kết nối đã hết thời gian. Vấn đề của tôi không giống như vấn đề Keep-Alive được giải thích trong liên kết đó, tuy nhiên dường như đó là kết quả cuối cùng.
Tôi đã khắc phục sự cố của mình bằng cách chạy khối đệ quy bất cứ khi nào tôi gặp lỗi -1005 và điều này làm cho kết nối cuối cùng được khắc phục mặc dù đôi khi đệ quy có thể lặp lại hơn 100 lần trước khi kết nối hoạt động, tuy nhiên nó chỉ thêm một giây khi chạy lần và tôi cá rằng đó chỉ là thời gian mà trình gỡ lỗi cần để in NSLog cho tôi.
Đây là cách tôi chạy một khối đệ quy với AFNetworking: Thêm mã này vào tệp lớp kết nối của bạn
// 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); };
}
Sau đó sử dụng nó như thế này:
+ (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);
}
Bạn sẽ thấy rằng tôi sử dụng một AFHTTPRequestOperation
lớp con nhưng thêm mã yêu cầu của riêng bạn. Phần quan trọng là gọi recurse(@offset.intValue+1));
để làm cho khối được gọi lại.