iOS 8 기기에서 실행되는이 문제도 있습니다. 여기에 더 자세히 설명 되어 있으며 이미 시간 초과 된 연결을 사용하려는 iOS의 경우 인 것 같습니다. 내 문제는 해당 링크에서 설명한 Keep-Alive 문제와 동일하지 않지만 동일한 최종 결과 인 것 같습니다.
오류 -1005가 나타날 때마다 재귀 블록을 실행하여 문제를 해결했으며 때로는 연결이 작동하기 전에 재귀가 100 + 번 반복 될 수 있지만 결국에는 연결이 이루어 지지만 실행에 단 2 초만 추가됩니다. 시간과 나는 그것이 디버거가 NSLog를 인쇄하는 데 걸리는 시간 일뿐입니다.
AFNetworking을 사용하여 재귀 블록을 실행하는 방법은 다음과 같습니다.이 코드를 연결 클래스 파일에 추가하십시오.
// 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); };
}
그런 다음 이것을 좋아하십시오 :
+ (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);
}
AFHTTPRequestOperation
서브 클래스를 사용 하지만 요청 코드를 추가 하는 것을 볼 수 있습니다. 중요한 부분은 recurse(@offset.intValue+1));
블록을 다시 호출 하도록 호출 하는 것입니다.