阻止主线程,直到UIWebView完成加载

时间:2012-05-07 15:19:16

标签: iphone ios uiwebview

我试图阻止主线程直到UIWebView完成加载,但是在调用[NSThread sleepForTimeInterval:]之后调用[UIWebView loadRequest:]会使加载永远不会完成:webViewDidFinishLoad委托在睡眠后被调用饰面。

为什么会这样?以及如何阻止主线程?
我正在从loadPage调用[ViewController willRotateToInterfaceOrientation:],我要做的是阻止iOS界面旋转,直到加载了具有其他方向的webview。

- (void)loadPage {
    UIWebView* webview2 = [[UIWebView alloc] initWithFrame:rect];
    webview2.delegate = self;

    NSString* htmlPath = ..... ; // Path to local html file
    NSURL *newURL = [[[NSURL alloc] initFileURLWithPath: htmlPath] autorelease];
    NSURLRequest *newURLRequest = [[[NSURLRequest alloc] initWithURL: newURL] autorelease];

    [webview2 loadRequest:newURLRequest];
    [NSThread sleepForTimeInterval:10.0f]; // Why this blocks the uiwebview thread ??
    [self.view addSubview:webview2];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    NSLog(@"Finished loading!");
}

2 个答案:

答案 0 :(得分:1)

我认为你正试图解决错误的问题。

您不想阻止主线程。首先,整个UI都是在主线程上绘制的,因此它看起来好像你的应用程序已挂起。其次,UIWebView是UI的一部分(这可能就是你正在做的事情不起作用的原因)。

那么,该怎么办?

看看以下方法:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

当您开始加载页面时,您可以从此方法返回NO。加载完成后,您可以正常返回值。 UIWebView有一个代表,告诉您状态。

答案 1 :(得分:0)

查看NSURLRequest的类引用,其中有一个同步方法。

+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error