- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在我的应用程序中,我尝试使用 WebView(不可见)导航到给定的 URL。但是,加载 Web 内容是异步发生的。对于以后的处理,我需要它来等待所有 Web 内容加载(包括重定向)。
我尝试使用 CFRunLoopRunInMode
让它等待(或超时),但无法让它在可用的循环模式下正常工作。使用 kCFRunLoopDefaultMode
时,不会进行重定向,加载请求会在第一个地址处停止。 kCFRunLoopCommonModes
模式甚至在加载请求后崩溃(swift 代码,所以我没有任何有用的错误信息)。
我已经将我的类注册为帧加载委托(delegate),所以我知道什么时候加载了所有内容(即使在多次重定向之后)。我只需要在运行循环处于事件状态时让它工作(没有它也能很好地工作)。代码:
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 都可以给出一个解决方案。
最佳答案
您可以在 webViewDidFinishLoad:
和 didFailLoadWithError:
中使用 performSelector:onThread:
在 webview 完成加载时执行您想要的任何任务。
关于objective-c - 如何同步运行WebView.mainFrame.loadRequest?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30166585/
我已经阅读了 UIWebView 上的内容,但找不到在调用 loadRequest 时是否可以阻止线程(如 NSURL 可以)的具体答案。我听说有一个特定的 UIWebView 线程,所有 UIWeb
在我的应用程序中,我使用 Webview 根据用户的首选语言加载网站的不同版本。为此使用 WebFrame 的 loadRequest 方法 - [[aWebView mainFrame] loadR
我正在使用UIWebView播放.mp3文件。使用Safari是因为它为我提供了无需附加代码的音频控件,而且我看不到如何使用AVPlayer进行操作。它很简单,除了一个异常(exception),效果
我有 2 个类,UIViewController 类型的 MainViewController 和 UIView 类型的 Foo。 在 MainViewController 中,我实现了一个名为 my
当我使用UIWebView使用loadRequest显示网页时,有时网络不稳定,这是一个耗时的事情,所以我想随意取消loadRequest,怎么办? 最佳答案 只要打电话 [myWebView sto
我创建了一个 UIWebView 并调用了 [webview loadRequest:url]。当 webview 没有父 View /父 View 时,[webview isLoading] 不断返
所以我正在尝试将一个简单的 URL (http://www.google.com) 加载到 WebView 中。我在我正在使用的应用程序中有这个,但将其归结为一个基本应用程序以删除其他变量。我有一个绝
我的目标是在 webView 仍在从服务器获取数据时做一个事件指示器 但我似乎无法找到这样做的方法。我能想到的唯一方法是关闭,但如何关闭? 如果我不添加任何事件指示器,那么它将只是空白屏幕,然后在一段
我的应用程序中有一个 UIWebView, -(void)viewDidLaod{ NSURL *url = [NSURL URLWithString:@"some url string"];
在我的 Controller 中,我调用了 WKWebViewInstance.loadRequest(url)。如果没有可用的互联网,我想在 WKWebView 中加载一条错误消息。 我发现了
如何将以下内容转换为使用“loadRequest”而不是“loadHTMLString”? 我需要添加一个 HTTP header ,我发现的唯一方法是将 loadRequest 与 NSMutabl
我正在尝试使用 UIWebView 在我的应用程序中嵌入网站的移动版本。但是,当我执行以下操作时: NSURL *url = [NSURL URLWithString:webLink]; NSMuta
在我的应用程序中,我尝试使用 WebView(不可见)导航到给定的 URL。但是,加载 Web 内容是异步发生的。对于以后的处理,我需要它来等待所有 Web 内容加载(包括重定向)。 我尝试使用 CF
我有一个 UIWebView,其中的内容被缩放以适合。然后调整 webview 的大小以适应内容(见下文),并按预期工作。 webview 也有一个滑动手势来加载新页面 - 当在 webview 上为
我正在按照 this 创建一个 webView 应用程序教程。我完全按照所有步骤操作,但出现此错误: No visible @interface 'UIView' declares the selec
我正在使用 UIWebView,并且已经在使用 webViewDidFinishLoad: 方法和一个在加载完成后执行的可选 block : -(void)webViewDidFinishLo
我有一个 UIWebView,我想将 SVG 图像加载到其中。该文件的内容是纯 SVG,即 ... .该文件可以很好地加载到普通和移动 Safari 中,也可以使用 loadRequest 在 UIW
我希望能够使用我的 UIWebView loadRequest 方法发送一些额外的 header 。 我试过: NSMutableURLRequest *req = [NSMutableURLRequ
我已经阅读了有关 UIWebView 的很多泄漏问题,但我的情况非常简单,所以我决定提出一个新问题。当我尝试从 WebView loadRequest 方法加载文件时,如果我在 Instruments
我正在尝试使用 Objective C 中的 webView 加载 URL。我尝试了“https://www.tidecleaners.com/cincinati-pricing ”,它适用于所有设备
我是一名优秀的程序员,十分优秀!