首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何同步运行WebView.mainFrame.loadRequest?

如何同步运行WebView.mainFrame.loadRequest?
EN

Stack Overflow用户
提问于 2015-05-11 19:33:34
回答 1查看 561关注 0票数 2

在我的应用程序中,我尝试使用WebView (不可见)导航到给定的网址。但是,加载web内容是异步进行的。对于以后的处理,我需要等待,直到所有的网页内容加载(包括重定向)。

我尝试使用CFRunLoopRunInMode使其等待(或超时),但无法使其在可用循环模式下正常工作。使用kCFRunLoopDefaultMode时,不会进行重定向,加载请求将在第一个地址停止。模式kCFRunLoopCommonModes甚至在加载请求之后崩溃(快速代码,所以我没有任何有用的错误信息)。

我已经将我的类注册为frame load委托,这样我就可以知道什么时候加载了所有内容(即使是在多次重定向之后)。我只需要让它在运行循环处于活动状态时工作(它在没有运行循环的情况下工作得很好)。代码:

代码语言:javascript
复制
  override func webView(sender: WebView!, didStartProvisionalLoadForFrame frame: WebFrame!) {
    jsLogger.logInfo("==> Start loading");
  }

  override func webView(sender: WebView!, willPerformClientRedirectToURL URL: NSURL!,
    delay seconds: NSTimeInterval, fireDate date: NSDate!, forFrame frame: WebFrame!) {
      redirecting = true;
  }

  override func webView(sender: WebView!, didCreateJavaScriptContext context: JSContext, forFrame: WebFrame!) {
    jsLogger.logInfo("==> JS create");
  }

  override func webView(sender: WebView!, didFinishLoadForFrame frame: WebFrame!) {
    if redirecting {
      redirecting = false;
      return;
    }

    jsLogger.logInfo("==> Navigating to: " + sender.mainFrameURL);
  }

  override func webView(sender: WebView!, didFailLoadWithError error: NSError!, forFrame frame: WebFrame!) {
    jsLogger.logError("Navigating to webpage failed with error \(error.localizedDescription)")
  }

下面是使用runloop加载URL的代码:

代码语言:javascript
复制
  func navigateAndWait(location: String) -> String {
    if let url = NSURL(string: location) {
      redirecting = false;
      webClient.mainFrame.loadRequest(NSURLRequest(URL: url));

      let result: Int = Int(CFRunLoopRunInMode(kCFRunLoopDefaultMode, 10, Boolean(0)));
      switch result {
      case kCFRunLoopRunFinished:
        return "Invalid run loop";

      case kCFRunLoopRunTimedOut:
        return "Call timed out";

      case kCFRunLoopRunStopped:
        fallthrough;

      default: // Everything ok.
        return "";
      }
    }
    return "Invalid URL";

  }

还有什么其他方法可以让我的线程等待加载请求完成?

注意: Obj-C和Swift都可以给出解决方案。

EN

回答 1

Stack Overflow用户

发布于 2015-07-05 11:54:36

您可以在webViewDidFinishLoad:didFailLoadWithError:中使用performSelector:onThread:在webview完成加载时执行任何您想要的任务。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30166585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档