ฉันมีปัญหานี้เช่นกันที่ทำงานบนอุปกรณ์ iOS 8 รายละเอียดเพิ่มเติมได้ที่นี่และดูเหมือนว่าเป็นกรณีของ iOS ที่พยายามใช้การเชื่อมต่อที่หมดเวลาไปแล้ว ปัญหาของฉันไม่เหมือนกับปัญหา Keep-Alive ที่อธิบายในลิงก์นั้นอย่างไรก็ตามดูเหมือนว่าจะเป็นผลลัพธ์สุดท้ายเดียวกัน
ฉันแก้ไขปัญหาของฉันด้วยการเรียกใช้บล็อกแบบเรียกซ้ำเมื่อใดก็ตามที่ฉันได้รับข้อผิดพลาด -1005 และนี่ทำให้การเชื่อมต่อผ่านในที่สุดแม้ว่าบางครั้งการวนรอบสามารถวนซ้ำ 100 ครั้งก่อนการเชื่อมต่อใช้งานได้ ครั้งและฉันเดิมพันว่าเป็นเวลาใช้ดีบักเกอร์พิมพ์ 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));
เพื่อให้บล็อกถูกเรียกอีกครั้ง