如何同步运行WebView.mainFrame.loadRequest



在我的应用程序中,我试图使用WebView(不可见)导航到给定的URL。但是,加载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都可以给出一个解决方案。

当Web视图完成加载时,您可以在webViewDidFinishLoad:didFailLoadWithError:中使用performSelector:onThread:来执行您想要的任何任务。

最新更新