【问题标题】:How to run WebView.mainFrame.loadRequest synchronously?如何同步运行 WebView.mainFrame.loadRequest?
【发布时间】:2015-05-11 11:33:33
【问题描述】:

在我的应用程序中,我尝试使用 WebView(不可见)导航到给定的 URL。但是,加载 Web 内容是异步发生的。但是,对于以后的处理,我需要等到所有 Web 内容都加载完毕(包括重定向)。

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

我已将我的类注册为帧加载委托,因此我知道何时加载所有内容(即使在多次重定向之后)。我只需要在运行循环处于活动状态时让它工作(没有它也能很好地工作)。代码:

  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 的代码:

  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 提供解决方案。

【问题讨论】:

    标签: objective-c swift cocoa webview nsrunloop


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2018-08-11
      • 1970-01-01
      • 1970-01-01
      • 2022-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      相关资源
      最近更新 更多