मेरे पास यह मुद्दा भी है, एक iOS 8 डिवाइस पर चल रहा है। यह यहां कुछ और विस्तृत है और ऐसा लगता है कि आईओएस का मामला उन कनेक्शनों का उपयोग करने की कोशिश कर रहा है जो पहले ही समाप्त हो चुके हैं। मेरा मुद्दा वैसा ही नहीं है, जैसा कि उस लिंक में कीप-अलाइव समस्या के बारे में बताया गया है, हालांकि यह एक ही अंतिम परिणाम है।
जब भी मुझे एक त्रुटि -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));
ब्लॉक को फिर से कॉल करने के लिए बुला रहा है।