2010-12-07 7 views
0

Ich möchte eine PDF-Datei in einem Modal View-Controller laden. Seit dem Moment, dass ich die Größe der Datei nicht kennen, möchte ich es auf einem separaten Thread laden, so:NSThread zum Laden von PDF-Dateien

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [[UISharedApplication sharedApplication] setNetworkActivityIndicatorVisibile:YES]; 
    [NSThread detachNewThreadSelector:@selector(loadPDF) toTarget:self withObject:nil]; 
} 
- (void)loadPDF { 
    NSAutoreleasePool *threadPool = [[NSAutoreleasePool alloc] init]; 

    [self.webView loadRequest:[NSURLRequest requestWithURL:url]]; 

    [threadPool release]; 

    [self performSelectorOnMainThread:@selector(showPDF) withObject:nil waitUntilDone:NO]; 
} 
- (void)showPDF { 
    [self.webView setHidden:NO]; 
    [self.spinner stopAnimating]; 
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; 
} 

Verfahren in anderen Dateien ziemlich gut funktioniert (zumindest glaube ich), wo Ich parse einige XML-Daten, aber hier nicht. Kommentieren:

[self performSelectorOnMainThread:@selector(showPDF) withObject:nil waitUntilDone:NO]; 

lässt mich den Spinner und die Aktivitätsanzeige auf der Oberseite sehen. Also ich denke das:

[self.webView loadRequest:[NSURLRequest requestWithURL:url]]; 

wartet nicht bis zum Ende und gibt dem Anrufer die Kontrolle zurück. Wie kann ich es reparieren?

Antwort

1

Sie können/sollten nicht (haben es einmal zu arbeiten) aktualisieren Sie die Benutzeroberfläche in einem separaten Thread, sollten Sie alle auf der Hauptsache. Wie ich glaube, dass WebView ein UIWebView ist, ist dies wahrscheinlich der Grund.

Obwohl Sie die Webansicht von versteckt zu sichtbar auf dem Hauptthread ändern, ist die gesamte Aktualisierung und Erstellung der tatsächlichen UIWebView nicht.

Am besten erstellen Sie die Daten aus der URL dann performSelectorOnMainThread und übergeben Sie die Daten an eine Methode im Hauptthread, die das UIWebview mit den Daten aktualisiert.

+0

Funktioniert gut. Vielen Dank. – IssamTP

1

Implementieren Sie die Methode webViewDidFinishLoad: von UIWebViewDelegate und rufen Sie Ihre dort an.

Verwandte Themen