2013-03-20 8 views
5

अधिकतर एक मामूली मामला है लेकिन क्या पूरा होने वाला ब्लॉक हमेशा [NSURLConnection sendAsynchronousRequest: ...] का उपयोग करके बुलाया जाएगा? या मुझे टाइमआउट टाइमर लागू करना है?क्या [NSURLConnection sendAsynchronousRequest: ...] हमेशा समापन ब्लॉक भेज देगा?

[self showHUDWithTitle:@"Configuring"]; 
[NSURLConnection sendAsynchronousRequest:request 
            queue:[[NSOperationQueue alloc] init] 
         completionHandler:^(NSURLResponse *response, 
              NSData *data, 
              NSError *error) { 

    if ([data length] >0 && error == nil) { 
     [self hideHUDWithFlag:YES 
         andTitle:@"Finished" 
        andSubtitle:@"(Box was configured)"]; 

    } else if ([data length] == 0 && error == nil) { 
     [self hideHUDWithFlag:NO 
         andTitle:@"Failed" 
        andSubtitle:@"(Check box connection)"]; 
     NSLog(@"Nothing was downloaded."); 

    } else if (error != nil) { 
     [self hideHUDWithFlag:NO 
        andTitle:@"Error" 
        andSubtitle:@"(Check box connection)"]; 
     NSLog(@"Error = %@", error); 
    } 
}]; 
+0

स्वाभाविक रूप से। एक समापन हैंडलर एक पूर्ण हैंडलर है - सफलतापूर्वक हैंडलर नहीं: डी –

+0

@ दाईज-दंजन मैं सफलता हैंडलर हूं, पूरा पूरा करने वाला पूरा नहीं! – Groot

+1

अगर (! त्रुटि) = सफलता: डी –

उत्तर

15

हां, पूरा होने वाला हैंडलर हमेशा कॉल किया जाता है। यदि अनुरोध टाइमआउट के कारण विफल रहता है, तो error सेट किया जाएगा और data = nil होगा।

NSURLRequest में 60 सेकंड का डिफ़ॉल्ट टाइमआउट है, लेकिन आप कनेक्शन शुरू करने से पहले request.timeoutInverval पर एक अलग मान असाइन कर सकते हैं। तो एक अतिरिक्त टाइमर की कोई ज़रूरत नहीं है।

जोड़ा गया: समय समाप्त होने की स्थिति में:

  • [error domain]NSURLErrorDomain है, और
  • [error code]NSURLErrorTimedOut है,

तुम सिर्फ एक त्रुटि संदेश पेश करने के लिए चाहते हैं, आप [error localizedDescription] का उपयोग कर सकते हैं, जो "अनुरोध का समय समाप्त हो गया है।" इस मामले में। (यह लोकेल पर निर्भर हो सकता है।)

+0

महान उत्तर, धन्यवाद! – Groot

+0

@ फिलिप: आपका स्वागत है। मैंने कुछ जानकारी जोड़ दी है कि आप टाइमआउट के लिए कैसे जांच सकते हैं। –

0

[NSURLConnection sendAsynchronousRequest: ...] निश्चित रूप से किसी भी परिदृश्य में एक पूरा होने के ब्लॉक कॉल करेंगे जहां मैं कॉल करने से पहले एक MBProgressView जोड़ सकते हैं और इसे हटाने के ही पूरा होने ब्लॉक में

निम्नलिखित पर विचार करें। हालांकि अगर आप इस प्रक्रिया को अधिकतम समय तक सीमित करना चाहते हैं, तो आप टाइमआउट टाइमर का भी उपयोग कर सकते हैं।

प्रगति पट्टी के लिए, आप मूल्य को कैसे बढ़ाएंगे? प्रगति पट्टी के बजाय, मैं सुझाव देता हूं कि आप गतिविधि संकेतक के साथ जाएं।

उम्मीद है कि इससे मदद मिलती है।

2
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url 
               cachePolicy:NSURLCacheStorageAllowed    
              timeoutInterval:20]; 
+2

कृपया यह बताने की कोशिश करें कि आपने क्या किया और क्यों। लोग शायद ही कभी कोड-केवल उत्तरों से सीखते हैं। – Jasper

संबंधित मुद्दे