2015-05-11 98 views
2

在我的應用程序中,我試圖使用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都可以給出解決方案。

回答

0

在webview完成加載時,您可以使用performSelector:onThread:中的webViewDidFinishLoad:didFailLoadWithError:執行所需的任何任務。