2013-01-14 28 views
8

में कई YouTube वीडियो के साथ HTML फ़ाइल लोड करते समय स्मृति चेतावनियां और क्रैश हो जाता है, मैं अपने ऐप में UIWebView का उपयोग कर रहा हूं। यह सामान्य रूप से अच्छी तरह से काम करता है, लेकिन ऐसी स्थिति है जिसमें ऐप को स्मृति चेतावनी मिलती है और अंत में दुर्घटनाग्रस्त हो जाती है।ऐप को UIWebView

मैं इस के साथ सामग्री लोड:

[self.webView loadHTMLString:htmlString baseURL:baseURL]; 

वहाँ एक मामला है जिसमें htmlString 25 के अंदर से अधिक YouTube वीडियो है (यह मेरा विचार नहीं है - यह वेब पेज मैं प्राप्त कर रहा हूँ है)। तो इस मामले में, ऐप को कुछ मेमोरी चेतावनियां मिलती हैं और अंत में दुर्घटनाग्रस्त हो जाती है।

मैं इस स्थिति का प्रबंधन कैसे कर सकता हूं? क्या एचटीएमएल फाइल को विभिन्न चरणों में लोड करना संभव है?

मुझे नहीं पता कि इसका इसके साथ कुछ लेना है, लेकिन मैं UIWebView आकार - और एक स्क्रॉल व्यू का सामग्री आकार भी सेट कर रहा हूं जो वेब दृश्य को गतिशील रूप से संलग्न करता है।

- (void) webViewDidFinishLoad:(UIWebView *)webView 
{ 
    // Adaptamos las vistas al contenido y ocultamos el indicador de actividad 

    // Ponemos el webView del tamaño justo del contenido 

    CGRect frame = webView.frame; 
    // Hace falta cambiar la height porque si no, no coge los cambios. Visualmente no se ve diferencia 
    frame.size.height = 1; 
    webView.frame = frame; 
    CGSize fittingSize = [webView sizeThatFits:CGSizeZero]; 
    frame.size.height = fittingSize.height; 
    webView.frame = frame; 

    // Movemos el botón y lo ponemos donde acabe el webView 
    CGRect buttonFrame = self.visitSiteButton.frame; 
    buttonFrame.origin.y = frame.origin.y + frame.size.height + 20; 
    self.visitSiteButton.frame = buttonFrame; 

    // Ampliamos el contenSize del scrollview general para que quepa todo el webView 
    self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width, self.visitSiteButton.frame.origin.y + self.visitSiteButton.frame.size.height + 10); 
} 

धन्यवाद एक बहुत,

कार्लोस

उत्तर

0

ऐसा लगता है कि एक एकल HTML पृष्ठ में 25 यूट्यूब वीडियो बहुत ज्यादा है: स्मृति भरता है और एप्लिकेशन मार दिया जाता है यह कोड है।

मुझे संदेह है कि यदि आप अपने HTML पृष्ठ के डिज़ाइन को संशोधित करने के इच्छुक नहीं हैं तो मुझे बहुत कुछ करना है। लेकिन यदि आप इच्छुक हैं, तो बहुत सारे विकल्प हैं। उदाहरण के लिए, आप एचटीएमएल (जावास्क्रिप्ट के माध्यम से) के आलसी भार को लागू कर सकते हैं ताकि केवल कुछ मुट्ठी भर वीडियो प्रदर्शित हो जाएं (जैसे UITableView में)। या आप एचटीएमएल कोड को प्रतिस्थापित कर सकते हैं जो यूट्यूब के साथ कुछ अन्य "लाइटर" के साथ लिंक करता है और फिर उपयोगकर्ता को एक विशिष्ट वीडियो देखने के लिए एक नया UIWebView लोड करने देता है। आदि

+0

हाँ, मुझे पता है। लेकिन यह वह फ़ाइल है जो मुझे प्राप्त हो रही है ... और इसे संशोधित करना आसान नहीं है क्योंकि मुझे प्राप्त HTML सामग्री के बारे में मेरा नियंत्रण नहीं है।यह आरएसएस फ़ीड की सामग्री है। – Carlos

+0

यदि इसकी संरचना है, तो आप इसे पार्स कर सकते हैं और जिस तरह से आपको चाहिए उसे संभाल सकते हैं। एक आरएसएस रीडर की कल्पना करें जो एक समय में 5 प्रविष्टियों को प्रदर्शित करता है ... यह सुनिश्चित करने के लिए व्यवहार्य है .. – sergio

+0

समस्या यह है कि मुझे विभिन्न स्रोतों (विभिन्न आरएसएस फ़ीड) से डेटा मिल रहा है और प्रत्येक स्रोत की एक अलग संरचना है। यहां तक ​​कि प्रत्येक फ़ीड से अलग-अलग समाचार अलग-अलग हो सकते हैं (एक पूरी तरह से अलग HTML फ़ाइल) – Carlos

2

कठिन स्थिति। अगर आपको विश्वास है कि आपका कोड कारण नहीं है (लीक की जांच के लिए उपकरणों का उपयोग करें); तो आपकी अगली सबसे अच्छी शर्त दुर्घटना से बचने और उससे बचने के लिए हो सकती है। कुछ संभावनाओं दिमाग में आते हैं:

1) आप स्मृति चेतावनी प्राप्त करते हैं, आप संभवतः सकता है:

if (self.webView.loading) { 
    [self.webview stopLoading]; 
    //inform user page cannot be fully loaded. 
} 

2) यदि वह काम नहीं करता, तो आप में सक्षम return NO को UIWebViewDelegatewebView:shouldStartLoadWithRequest:navigationType: में निम्नलिखित हो सकता है पृष्ठ को भारी संसाधनों में खींचने से रोकने के लिए एक स्मृति चेतावनी।

3) शायद अंतिम उपाय के रूप में, वेबव्यू लोड को रोकें, इसे अपने दृश्य से हटा दें, और इसे छोड़ दें।

आशा है कि उनमें से एक काम करेगा। क्या आप उस पृष्ठ को साझा कर सकते हैं जो आपको क्रैश कर रहा है? परीक्षण उद्देश्यों के लिए सहायक लगता है! इसके अलावा - यदि आप इसे निम्न स्तर पर संबोधित करना चाहते हैं तो आपको ऐप्पल के साथ एक रडार दर्ज करना चाहिए।

+0

धन्यवाद डेव! मैं आपके सुझावों का प्रयास करूंगा। दुर्भाग्य से, जो एचटीएमएल लोड करने की कोशिश कर रहा था वह आरएसएस फ़ीड से आया था और अब, यह फ़ीड से गायब हो गया है ... अगर मुझे फिर से समस्या मिलती है तो मैं आपकी सिफारिशों का प्रयास करूंगा! – Carlos

3

एक शरारती छोटी चाल के बारे में कैसे। नीचे के रूप में कोड के साथ पृष्ठ के HTML प्राप्त करें: regex

NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url]; 
    NSURLResponse * response = nil; 
    NSError * error = nil; 
    NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
NSString* newStr = [[NSString alloc] initWithData:theData 
            encoding:NSUTF8StringEncoding]; 

उपयोग वीडियो तत्वों को खोजने और अपने कस्टम छवि हाइपरलिंक टैग के साथ बदलने के लिए>। एचटीएमएल स्ट्रिंग को प्रदर्शित करें:

[webView loadHTMLString: baseURL:nil];