2010-02-22 13 views
9

In una delle mie app riutilizza una webview. Ogni volta che l'utente inserisce una certa visione sui dati reload nella cache al WebView utilizzando il metodo: -UIWebView riutilizzato che mostra il contenuto caricato precedente per un breve secondo su iPhone

- (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)encodingName baseURL:(NSURL *)baseURL

e aspetto la chiamata di richiamata

- (void) webViewDidFinishLoad:(UIWebView *)webView.

Nel frattempo nascondo la webview e mostro un'etichetta di 'caricamento'. Solo quando ricevo webViewDidFinishLoad visualizzo la webview.

Molte volte ciò accade vedo i dati precedenti che è stato caricato per il WebView per un breve istante prima del nuovo dati caricai calci.

già aggiunto un ritardo di 0,2 secondi prima di visualizzare la webview ma non ha aiutato

Invece di risolvere questo problema aggiungendo più tempo al ritardo qualcuno sa come risolvere questo problema o forse cancellare vecchi dati da una visualizzazione Web senza rilascio e allocarli ogni volta?

risposta

11

Grazie malaki1974, nel mio caso non stavo usando una vista modale. Quando mi sono seduto con un ingegnere Apple al WWDC 2010 e gli ho fatto questa domanda, la sua risposta era semplicemente: "Non riutilizzare UIWebViews, non è così che dovrebbero essere usati." Da allora ho assicuratevi di chiamate questo insieme di linee prima di assegnare un nuovo UIWebView

[self.myWebView removeFromSuperview]; 
self.myWebView.delegate = nil; 
[self.myWebView stopLoading]; 
[self.myWebView release]; 

che ha risolto il problema.

+2

Davvero? È una cosa davvero stupida da parte di Apple considerare le Webviews costose da creare – hfossli

+0

Ecco perché volevo riutilizzarle in primo luogo. Ma l'ingegnere Apple ha fortemente insistito sul fatto che non erano destinati ad essere riutilizzati (almeno in quel momento della vita in cui iOS4 è stato appena introdotto). Devo ammettere che da quando ho implementato il suo consiglio non ho più incontrato il problema. – Roi

+0

Bene .. Non posso vivere senza riutilizzare considerando quanto sia costoso. Funziona bene con me usando @ "about: blank" -trick ... – hfossli

1

Innanzitutto, lo UIWebView lo rende contenuto in un thread in background. Anche se ricevi webViewDidFinishLoad:, potrebbe non essere completato. Specialmente se si tratta di una pagina intensa ajax proveniente dalla rete.

Si dice che si nasconde la vista. Mi chiedo se questo significhi che la webview ritarda completamente il suo disegno. Quello che potresti provare è spostare lo schermo esterno UIWebView o oscurarlo con un'altra vista. Forse questo cambierà il suo comportamento di disegno.

Se non avete bisogno di un sistema interattivo UIWebView allora si può anche prendere in considerazione di farlo completamente fuori campo in un separato UIWindow e quindi creare un'immagine da quello strato UIWebView s'.

+0

"potrebbe non essere completamente fatto" - c'è un modo per sapere quando è completamente finito? – Segev

0

Prova a caricare un file locale vuoto o con un grafico di caricamento quando lo nascondi, piuttosto che caricare semplicemente nuovi contenuti quando lo mostri. Poiché il file è locale, sarà veloce e anche se la nuova pagina impiega un po 'di tempo a caricarsi, avrà un comportamento previsto in bianco o in caricamento.

+0

Sfortunatamente, questo non è utile. Anche loadHTMLString: @ "" ha abbastanza tempo per essere fastidioso. –

7

Cancella il contenuto del WebView Prima di tentare di caricare nuovi contenuti

[self loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]]; 
+0

Puoi dare qualche spiegazione in più su questo? Questo mostra una webview vuota ... ma come si collega al problema del ritardo del contenuto? – nodepond

+0

Ah, ho capito. Non si tratta del ritardo, ma della cancellazione del contenuto prima di mostrare il nuovo! – nodepond

+0

Sì. Questa è l'idea. Sto pubblicando un'altra alternativa anche adesso. – hfossli

0

Se hai controll sopra il codice html. Puoi comunicare a oggettivo-c quando il documento è pronto. In questo modo in jQuery:

function messageNative (name, string) { 

    var iframe = document.createElement("IFRAME"); 

    iframe.setAttribute("src", "appscheme://" + name + "/" + string); 
    document.documentElement.appendChild(iframe); 
    iframe.parentNode.removeChild(iframe); 
    iframe = null; 
} 

$(function() { 
    messageNative('webview', 'ready'); 
}); 

E poi nel metodo delegato WebView di UIWebView: shouldStartLoadWithRequest: navigationType: attendere la richiesta con l'URL uguale a "appscheme: // WebView/ready". Allora dovresti sapere: il documento è caricato e pronto per la visualizzazione. Poi tutto quello che manca è un semplice fade-in o qualcosa del genere :)

1

Questo è quello che faccio, e funziona:

[_webView stringByEvaluatingJavaScriptFromString:@"document.open();document.close();"]; 
Problemi correlati