Saya memiliki masalah ini juga, berjalan pada perangkat iOS 8. Ini lebih rinci di sini dan tampaknya merupakan kasus iOS yang mencoba menggunakan koneksi yang sudah kehabisan waktu. Masalah saya tidak sama dengan masalah Keep-Alive yang dijelaskan di tautan itu, namun tampaknya merupakan hasil akhir yang sama.
Saya telah memperbaiki masalah saya dengan menjalankan blok rekursif setiap kali saya menerima kesalahan -1005 dan ini membuat koneksi akhirnya bisa melewati meskipun kadang-kadang rekursi dapat berulang selama 100 kali sebelum koneksi bekerja, namun itu hanya menambah detik berjalan. kali dan saya yakin itu hanya waktu yang dibutuhkan debugger untuk mencetak NSLog untuk saya.
Inilah cara saya menjalankan blok rekursif dengan AFNetworking: Tambahkan kode ini ke file kelas koneksi Anda
// 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); };
}
Kemudian gunakan suka ini:
+ (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);
}
Anda akan melihat bahwa saya menggunakan AFHTTPRequestOperation
subkelas tetapi menambahkan kode permintaan Anda sendiri. Bagian yang penting adalah panggilan recurse(@offset.intValue+1));
untuk membuat blok dipanggil lagi.