2012-07-23 26 views
22

मेरे पास एक साधारण आईओएस देशी ऐप है जो एक एकल UIWebView लोड करता है। मैं वेब व्यू को एक त्रुटि संदेश दिखाना चाहता हूं यदि ऐप पूरी तरह से 20 सेकंड के भीतर वेब व्यू में प्रारंभिक पृष्ठ लोड करने को पूरा नहीं करता है।आईओएस ऐप - UIWebView लोडिंग के लिए सेट टाइमआउट

मैं इस तरह मेरी viewDidLoad (सरलीकृत) के भीतर WebView के लिए मेरे URL लोड:

[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.example.com"] cachePolicy:NSURLCacheStorageAllowed timeoutInterval:20.0]]; 

कोड के भीतर timeoutInterval ऊपर वास्तव में कुछ भी "do" नहीं है, एप्पल यह करने के लिए ओएस के भीतर निर्धारित है के रूप में वास्तव में 240 सेकंड के लिए बाहर समय नहीं है।

मेरे पास webView didFailLoadWithError क्रियाएँ सेट हैं, लेकिन यदि उपयोगकर्ता नेटवर्क कनेक्शन है, तो इसे कभी भी कॉल नहीं किया जाता है। वेबव्यू बस मेरे नेटवर्क एक्टिविटी इंडिकेटर कताई के साथ लोड करने का प्रयास जारी रखता है।

क्या वेब व्यू के लिए टाइमआउट सेट करने का कोई तरीका है?

+1

किसी यहां कहा टाइमआउट अंतराल कनेक्शन के लिए है। एक बार यह सर्वर से कनेक्ट हो जाने पर, यह अब त्रुटि नहीं फेंक देगा। WebViewDidStartLoad में कनेक्ट होने के बाद आपको अपने स्वयं के एनएसटीमर को कार्यान्वित करने की आवश्यकता है और अपने आप को रद्द करें http://stackoverflow.com/questions/1883888/nsmutableurlrequest-timeout-doesnt-trigger-if-data-starts-to-load-but-not- webvi – mask8

+0

ऐसा लगता है कि मैं वास्तव में क्या देख रहा हूं ... क्या आप मुझे इसे लागू करने के तरीके पर कुछ मार्गदर्शन दे सकते हैं? (मैं एक उद्देश्य-सी न्यूबी हूं) – adamdehaven

+0

मुझे सिर्फ यह जानने की जरूरत है कि इसके लिए क्या रखा जाए: '- (शून्य) वेब व्यू: एनएसटीमर * द टाइमर { एनएसएलओजी (@" मी 1 मिनट की देरी पर है "); } ' मैं किस लक्ष्य विधि का उपयोग करूंगा? – adamdehaven

उत्तर

40

टाइमआउट इंटरवल कनेक्शन के लिए है। एक बार वेबव्यू यूआरएल से जुड़ा हुआ है, तो आपको एनएसटीमर शुरू करना होगा और अपना टाइमआउट हैंडलिंग करना होगा। की तरह कुछ:

// define NSTimer *timer; somewhere in your class 

- (void)cancelWeb 
{ 
    NSLog(@"didn't finish loading within 20 sec"); 
    // do anything error 
} 

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    [timer invalidate]; 
} 

- (void)webViewDidStartLoad:(UIWebView *)webView 
{ 
    // webView connected 
    timer = [NSTimer scheduledTimerWithTimeInterval:20.0 target:self selector:@selector(cancelWeb) userInfo:nil repeats:NO]; 
} 
+0

में मदद करता है मैंने ऊपर दिए गए तरीकों को जोड़ा है, लेकिन यह 20 सेकंड के बाद कुछ भी नहीं करता है? - मैंने 'रद्द करेंब' संपत्ति के अंदर UIAlertView डाला लेकिन यह कभी भी आग नहीं लगाता है। – adamdehaven

+1

क्षमा करें एक परिवर्तन, न कि 'एनएसटीमर टाइमर विथटाइम इंटरवल' लेकिन 'निर्धारित टाइमर विथटाइम इंटरवल'। एक बार आपका वेब व्यू यूआरएल से कनेक्ट हो जाने के बाद, 'webViewDidStartLoad' लागू किया जाएगा। यदि नहीं, तो आपने प्रतिनिधि को सही तरीके से सेट नहीं किया है। फिर उस विधि में 20 सेकंड में 'cancelWeb' विधि को कॉल करने के लिए टाइमर शुरू होता है। – mask8

+0

बहुत बहुत धन्यवाद !!! पूरी तरह से काम करता है :) एक और सवाल - क्या मुझे टाइमर को रिलीज़ करने के लिए कुछ भी करने की ज़रूरत है यदि वे 'viewWillDisappear' या' viewDidUnload' में ऐप से बाहर निकलें? – adamdehaven

3

मेरे रास्ते स्वीकार किए जाते हैं जवाब देने के लिए समान है, लेकिन केवल जब समय बाहर और नियंत्रण didFailLoadWithError में stopLoading है।

- (void)timeout{ 
    if ([self.webView isLoading]) { 
     [self.webView stopLoading];//fire in didFailLoadWithError 
    } 
} 

- (void)webViewDidStartLoad:(UIWebView *)webView{ 
    self.timer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(timeout) userInfo:nil repeats:NO]; 
} 

- (void)webViewDidFinishLoad:(UIWebView *)webView{ 
    [self.timer invalidate]; 
} 

- (void)webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)error{ 
    //Error 999 fire when stopLoading 
    [self.timer invalidate];//invalidate for other errors, not time out. 
} 
+0

यह बेहतर जवाब है क्योंकि यह वास्तव में टाइमआउट के बाद वेब दृश्य को रोक देता है। मैं इसे अमान्य करने के बाद और इसे पूरा करने के बाद 'self.timer'' nil' को सेट करने का भी सुझाव दूंगा। – rmaddy

2

स्विफ्ट कोडर पालन यह कर सकते हैं:

var timeOut: NSTimer! 

func webViewDidStartLoad(webView: UIWebView) { 
    self.timeOut = NSTimer.scheduledTimerWithTimeInterval(7.0, target: self, selector: "cancelWeb", userInfo: nil, repeats: false) 
} 

func webViewDidFinishLoad(webView: UIWebView) { 
    self.timeOut.invalidate() 
} 

func webView(webView: UIWebView, didFailLoadWithError error: NSError?) { 
    self.timeOut.invalidate() 
} 

func cancelWeb() { 
    print("cancelWeb") 
} 
6

सुझाव दिया समाधान की सभी आदर्श नहीं हैं। इस संभाल करने के लिए सही तरीका NSMutableURLRequest पर ही timeoutInterval उपयोग कर रहा है:

NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://web.site"]]; 

request.timeoutInterval = 10; 

[webview loadRequest:request]; 
+0

यह सही समाधान है !!! – ElectroBuddha

+0

क्या यह कॉल टाइमआउट के बाद 'didFailToLoad withError' होगा? –

+1

@AlbertRenshaw हाँ, यह स्वचालित रूप से प्रतिनिधि विधि को कॉल करता है –