2012-02-10 16 views
6

मैंने पढ़ा है कि UIWebViews का पुन: उपयोग करना एक बुरा अभ्यास है। काम पर विरासत में मिला कुछ कोड UIWebView को विभिन्न प्रकार की सामग्री को दबा रहा है। पावरपॉइंट्स, वर्ड दस्तावेज़, और वीडियो। यह सब सामान्य परिस्थितियों में ठीक काम करता है। जब हम UIWebView में सामग्री को बहुत तेज़ी से बदलते हैं, तो यह डंप हो जाता है।UIWebView का उपयोग करने से क्रैश हो रहा है

मेरा वेब व्यू एक संपत्ति के रूप में सेट किया गया है। यह ठीक है आईबी में जुड़ा हुआ है। हमारी तालिका से सामान्य चयन दृश्य स्थानीय सामग्री को ठीक करता है। यह दुर्घटनाग्रस्त होने के लिए एक ही सेल या एकाधिक के संयोजनों का तेज़ अग्नि चयन लेता है।

मैं webViewDidFailWithError के लिए इसके लिए कुछ त्रुटि संदेश कैप्चर कर सकता हूं। लेकिन वे दुर्घटना के बिना भी ट्रिगर करेंगे। यहां स्थानीयकृत स्ट्रिंग त्रुटि है।

The operation couldn’t be completed. (NSURLErrorDomain error -999.) 

जब ऐप अंततः क्रैश हो जाता है, तो यह इस मूर्ख वेबकोर त्रुटि पर उड़ाता है।

Application Crash image

मैं इसे सराहना करते हैं किसी को भी किसी भी लिंक या कुछ कोड उदाहरण यह कैसे संभाल करने के लिए किया है। हो सकता है कि चीजों को उड़ाने के बिना मेरी वेबव्यू संपत्ति का सबसे अच्छा उपयोग कैसे करें।

मैं अपना कुछ कोड लोड करूंगा, लेकिन वेबव्यू से संबंधित नहीं होने पर बहुत कुछ चल रहा है। वेब सामग्री पर धक्का दिया जा रहा सभी सामग्री [self.webView loadRequest:request]; के माध्यम से स्थानीय सामग्री के पथ से भरा NSRLRequest होने के अनुरोध के साथ किया जाता है।

अगर कोई इस पर मेरी मदद कर सकता है तो मैं बहुत सराहना करता हूं। फिंगर्स कुछ आसान के लिए पार हो गया।

+0

शायद आपके वेबव्यू लोड अनुरोध के दौरान आपको उपयोगकर्ता इंटरैक्शन को अवरुद्ध करना चाहिए। –

+0

यह संभव हो सकता है, लेकिन यह सुनिश्चित नहीं है कि हमारे ग्राहक इसके लिए जाएंगे। मैं इसे ध्यान में रखूंगा। धन्यवाद। –

+0

क्या आपने इसे '@try {} @catch {} 'के साथ करने की कोशिश की है? –

उत्तर

2

मुझे यकीन नहीं है कि इस मुद्दे को हल करने का "सबसे अच्छा तरीका" है, लेकिन ऐसा लगता है कि यह काफी अच्छा काम कर रहा है। छोटा, मीठा, और यह काम करता है।

मैंने उपयोगकर्ता को अक्षम किया तालिका के साथ इंटरैक्शन देखें जो वेबव्यू में सामग्री को अपडेट करता है। चूंकि आपको इस पर बहुत अधिक मैश करना होगा, यहां या वहां एक टैप गायब होने की संभावना नहीं है। तो अभी के लिए, यह ठीक है।

#pragma mark - 
#pragma mark UIWebViewDelegate methods 

-(void)webViewDidStartLoad:(UIWebView *)webView { 
    [self.tableView setUserInteractionEnabled:NO]; 
} 

-(void)webViewDidFinishLoad:(UIWebView *)webView { 
    [self.tableView setUserInteractionEnabled:YES]; 
} 

// I re-enable on load failures as they can block you out entirely on fail 
-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { 
    [self.tableView setUserInteractionEnabled:YES]; 
} 
0

क्या आप कोई अन्य अनुरोध लोड करने से पहले [webview stopLoading]; का उपयोग कर रहे हैं? आपको एक अलग लोड करने की कोशिश करने से पहले वर्तमान लोडिंग को रद्द या बंद करना पड़ सकता है। दूसरा विकल्प उपयोगकर्ता इनपुट को प्रतिबंधित कर रहा है।

+0

मैंने [self.webView stopLoading] डालने का प्रयास किया है; इससे पहले कि मैं नया loadRequest बुलाओ, लेकिन इससे कोई फर्क नहीं पड़ता है, फिर भी दुर्घटनाग्रस्त हो जाता है। –

+0

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

+0

हाँ, मुझे यकीन है कि यह इसे ठीक करेगा। लेकिन वास्तव में समस्या को हल नहीं करता है। मैं इसे बहुत तेज़ कर सकता हूं और यह पकड़ता है। वास्तव में केवल अवास्तविक टैपिंग के साथ दुर्घटनाग्रस्त हो जाता है। काम करना मुझे यह समझना होगा कि दुर्घटनाओं को कैसे रोकें, यदि यह भी संभव हो। अंतर्दृष्टि के लिए धन्यवाद। –

1

यदि आप तुरंत टैप करते समय क्रैश हो रहे हैं, तो क्या आप एक गरीब व्यक्ति की दर सीमा के रूप में कार्य करने के लिए एक इशारा पहचानकर्ता डाल सकते हैं?

+0

तालिका पर इशारा पहचानकर्ता देखें- didSelectRowAtIndexPath? –

+0

जो भी दृश्य अनुरोधों को ट्रिगर कर रहा है, ताकि आप उन्हें अक्सर नहीं भेज सकें। –

0

अपने UIWebViewDelegate में, आप webView:shouldStartLoadWithRequest:navigationType: लागू NO वापस जाने के लिए अगर वहाँ पहले से ही है एक अनुरोध लोड हो रहा है हो सकता है।

0

मैं मदद नहीं कर सकता लेकिन लगता है कि आप UIWebView का पुनः उपयोग नहीं कर पाएंगे। निब को डुबोएं, इसे प्रोग्रामेटिक रूप से बनाएं और इसे डेटा स्रोत में बदलते समय इसे फिर से बनाएं और फिर से असाइन करें/फिर से आवंटित करें।

एक अलग नोट पर मैं डेटा लोडिंग के लिए NSOperationQueue का उपयोग करना सुनिश्चित करता हूं।

+0

सलाह के लिए धन्यवाद। दुर्भाग्यवश मेरे हाथ इस मामले में बंधे हैं। हमने यह पता लगाया कि इसके आसपास कैसे जाना है। हम एक प्रगति संकेतक के साथ एक UIView बना रहे हैं जो दिखा रहा है कि यह अभी भी लोड हो रहा है और उपयोगकर्ता को वेबव्यू ओवरलोड करने से रोक रहा है। यह काम करता है, ग्राहक खुश है, मैं उम्मीद कर सकता हूं। सलाह के लिए धन्यवाद। –

+0

एक अच्छा समझौता की तरह लगता है। सबसे अच्छा। – ader

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