2012-02-10 19 views
6

Ho letto che riutilizzare UIWebViews è una specie di cattiva pratica. Qualche codice che ho ereditato al lavoro sta spingendo una varietà di contenuti su un UIWebView. Punti di forza, documenti Word e video. Tutto funziona perfettamente in circostanze normali. Quando arriviamo a cambiare troppo velocemente il contenuto in UIWebView, si scaricano.Riutilizzare UIWebView sta causando arresti anomali

La mia WebView è impostata come una proprietà. È collegato in IB bene. Selezione normale dalla nostra tabellaVisualizza il contenuto locale in modo corretto. Ci vuole una rapida selezione del fuoco della stessa cella o di più combinazioni per farlo andare in crash.

Posso catturare alcuni messaggi di errore per esso per webViewDidFailWithError. Ma quelli si innescheranno anche senza un incidente. Ecco la stringa localizzata dell'errore.

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

Quando l'app si arresta definitivamente, esplode su questo stupido errore di WebCore.

Application Crash image

Se qualcuno ha qualche link o alcuni esempi di codice come gestire questo lo apprezzerei. Forse un esempio su come riutilizzare al meglio la mia proprietà webView senza far saltare in aria le cose.

Vorrei caricare parte del mio codice, ma ci sono molte cose non correlate alla webView stessa. Tutto il contenuto che viene trasferito alla webView viene effettuato tramite [self.webView loadRequest:request]; con la richiesta come NSURLRequest riempita con il percorso del contenuto locale.

Sarò molto riconoscente se qualcuno mi può aiutare su questo. Le dita incrociate per qualcosa di semplice.

+0

Forse dovresti bloccare l'interazione dell'utente mentre la tua webView carica la richiesta. –

+0

Questo potrebbe essere possibile, ma non è sicuro che il nostro cliente lo farà. Lo prenderò in considerazione. Grazie. –

+0

Lo hai provato con '@try {} @catch {}'? –

risposta

2

Non sono sicuro che questo sia il modo "migliore" per risolvere il problema, ma sembra funzionare abbastanza bene. Breve, dolce e funziona.

I disabled userInterazione con tableView che aggiorna il contenuto in webView. Dal momento che devi schiacciarlo così tanto, mancare un rubinetto qui o là probabilmente non ci mancherà. Quindi per ora, questa è la soluzione.

#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

Stai utilizzando [webview stopLoading]; prima di caricare un'altra richiesta? Quello che potrebbe essere necessario fare è cancellare o interrompere il caricamento corrente prima di provare a caricarne uno diverso. L'altra opzione sta limitando l'input dell'utente.

+0

Ho provato a mettere [self.webView stopLoading]; prima chiamo il nuovo loadRequest, ma non fa alcuna differenza, si blocca ancora. –

+0

Sembra che il problema sia all'interno di quella zona. Se si blocca solo quando si tocca rapidamente, il problema deve essere con le richieste multiple. Per quanto riguarda la limitazione dell'input dell'utente, non è necessario che finisca il caricamento. Potresti provare a ignorare i tocchi per un secondo o mezzo per vedere se questo risolve il problema. – Jaybit

+0

Sì, sono sicuro che avrebbe risolto il problema. Ma in realtà non risolve il problema. Posso martellarci sopra abbastanza velocemente e regge. In realtà si blocca solo con tapping non realistico. Il lavoro vorrebbe che io capissi come prevenire gli arresti anomali, se possibile. Grazie per l'intuizione. –

1

Se si arresta in modo anomalo solo quando si tocca rapidamente, è possibile posizionare un rilevatore di gesti su di esso per fungere da limitatore di velocità di un uomo povero?

+0

Riconoscimento di gesti sulla tabellaView -didSelectRowAtIndexPath? –

+0

Oltre qualsiasi visualizzazione che attiva le richieste, in modo da non inviarle troppo frequentemente. –

0

Nella tua UIWebViewDelegate, si potrebbe implementare webView:shouldStartLoadWithRequest:navigationType: per tornare NO se c'è già una richiesta di carico.

0

Non posso fare a meno di pensare che sarebbe meglio non riutilizzare UIWebView. Eliminare il pennino, crearlo a livello di codice e impostarlo su zero e ricrearlo/riassegnarlo/riassegnarlo quando cambia l'origine dei dati.

Su una nota diversa, mi assicuravo di utilizzare NSOperationQueue per il caricamento dei dati.

+0

Grazie per il consiglio. Sfortunatamente le mie mani sono legate alla questione. Abbiamo capito come aggirarlo. Stiamo creando un UIView con un indicatore di avanzamento che mostra che è ancora in fase di caricamento e impedisce all'utente di sovraccaricare la visualizzazione Web. Funziona, cliente felice, tutto ciò che posso sperare. Grazie per il consiglio. –

+0

Sembra un buon compromesso. Migliore. – ader

Problemi correlati