在我的應用程序中,我試圖使用WebView(不可見)導航到給定的URL。但是,加載網頁內容是異步發生的。爲了後續處理,我需要這個,直到所有的網頁內容加載(包括重定向)。如何同步運行WebView.mainFrame.loadRequest?
我嘗試使用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一個網址:
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都可以給出解決方案。