【问题标题】:Block main thread until UIWebView finishes loading阻塞主线程直到 UIWebView 完成加载
【发布时间】:2012-05-16 02:40:16
【问题描述】:

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

为什么会这样?以及如何阻止主线程?
我从[ViewController willRotateToInterfaceOrientation:] 调用loadPage,我想做的是防止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!");
}

【问题讨论】:

  • 不是你要找的,但为什么不在-(void)webViewDidFinishLoad:(UIWebView *)webView 中调用[[self view] addSubview:webView];?
  • 我希望界面在 uiwebview 加载完成后旋转。

标签: iphone ios uiwebview


【解决方案1】:

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

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

那么,该怎么办?

看看下面的方法:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

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

【讨论】:

  • 但是 shouldAutorotateToInterfaceOrientation: 只会被调用一次,当用户旋转设备时,如果我返回 NO 我不能在 webview 加载后强制旋转。
  • 而且,我确实想阻止 UI ... webview 将在大约半秒内加载,我希望屏幕冻结该时间,然后在 UIWebView 不显示空白页的情况下很好地旋转。
  • 仍然,阻塞主线程是行不通的。您要么必须提前下载内容,要么显示进度指示器或类似的东西。 iOS 界面的整体理念是流畅和用户驱动。你实际上是在试图打败它。
  • 我不必下载内容...它是本地的
  • 我认为基本问题是在等待 UIWebView 加载数据时保持 UI 响应而不显示中间视图是不现实的。要么您在加载数据时必须显示某种临时视图(空的 webView、现有视图等),要么您受制于获取数据所需的时间。我想不出任何方法来弯曲 iOS 时空连续体来打败它。 ;-) 显示无数据屏幕符合 Apple 在应用加载时显示未填充屏幕的模式,这是值得的。
【解决方案2】:

看看NSURLRequest的类引用,里面有一个同步方法。

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

【讨论】:

  • 但是我加载的文件是本地的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多