2013-01-14 2 views
8

Nella mia app sto utilizzando uno UIWebView. Normalmente funziona bene, ma c'è una situazione in cui l'app riceve un avviso di memoria e alla fine si blocca.L'app riceve avvisi di memoria e si blocca quando si carica il file HTML con molti video di YouTube in UIWebView

ho caricare il contenuto con questo:

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

C'è un caso in cui htmlString ha dentro oltre 25 video di YouTube (questa non è la mia idea - è la pagina web che sto ricevendo). Quindi in questo caso, l'app riceve alcuni avvisi di memoria e alla fine si blocca.

Come posso gestire questa situazione? È possibile caricare il file HTML in vari passaggi?

Non so se questo ha qualcosa a che fare con esso, ma sto impostando la dimensione UIWebView - e anche la dimensione del contenuto di una vista a scorrimento che racchiude la vista Web - dinamicamente. Questo è il codice:

- (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); 
} 

Grazie mille,

Carlos

risposta

0

Sembra che 25 i video di YouTube in una singola pagina HTML è troppo: la memoria si riempie e l'applicazione viene ucciso.

Dubito che ci sia molto da fare se non si è disposti a modificare il design della pagina HTML. Ma se sei disposto, allora ci sono molte opzioni. Ad esempio, potresti implementare il carico pigro dell'HTML (tramite javascript) in modo che venga visualizzata solo una manciata di video (come in un UITableView). Oppure potresti sostituire il codice HTML che collega a youtube con un altro "più leggero" e poi consentire all'utente di caricare un nuovo UIWebView per guardare un video specifico. Etc.

+0

Sì, lo so. Ma è il file che sto ricevendo ... E non è facile da modificare perché non ho il controllo sul contenuto HTML che ricevo.È il contenuto dei feed RSS. – Carlos

+0

se ha una struttura, è possibile analizzarlo e gestire il modo in cui è necessario. immagina un lettore di rss che visualizza 5 voci alla volta ... è fattibile per certo ... – sergio

+0

Il problema è che sto ottenendo i dati da fonti diverse (diversi feed rss) e ogni sorgente ha una struttura diversa. Anche le notizie diverse da ogni feed possono essere diverse (un file html completamente diverso) – Carlos

2

Situazione difficile. Se sei sicuro che il tuo codice non sia la causa (usa gli strumenti per controllare eventuali perdite); allora la tua prossima migliore possibilità potrebbe essere quella di cercare di evitare l'incidente. Alcune possibilità vengono in mente:

1) Quando si riceve l'avviso di memoria, si potrebbe:

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

2) Se questo non funziona, si potrebbe essere in grado di return NO in UIWebViewDelegatewebView:shouldStartLoadWithRequest:navigationType: seguente un avviso di memoria per impedire alla pagina di continuare a caricare risorse pesanti.

3) Forse come ultima risorsa, interrompere il caricamento di Webview, rimuoverlo dalla vista e rilasciarlo.

Spero che una di queste funzioni. Puoi condividere la pagina che ti sta bloccando? Sembra utile per scopi di test! Inoltre, dovresti archiviare un rdar con Apple nel caso in cui vorrebbero risolverlo a un livello inferiore.

+0

Grazie Dave! Proverò i tuoi suggerimenti. Sfortunatamente, il codice HTML che stavo cercando di caricare proviene da un feed RSS e ora è scomparso dal feed ... Se trovo il problema, proverò di nuovo con i tuoi consigli! – Carlos

3

Che ne dici di un piccolo trucco cattivo. Prendi il codice HTML della pagina con il codice, come di seguito:

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]; 

Usa espressione regolare per trovare elementi video e sostituirlo con il tag hyperlink immagine personalizzata>. Visualizza la stringa html come:

[webView loadHTMLString: baseURL:nil];