2016-07-31 64 views
3

私はWKWebViewに同期してJavascriptを読み込もうとしています。私の研究では、evaluateJavaScriptメソッドが非同期で、これがエラーの原因になっているように見えます。これは、JSよりも多くの動作をオーバーライドするJSの前にロードされるためです(非同期性のために一部の時間しか動作しません)。Swift:非同期メソッドを同期メソッドでラップする方法は?

私はこれを試してみたが、動作していないよう:

extension WKWebView { 
    func evaluateJavaScriptSynchronously(script: String, completion:() -> Void) { 
    let semaphore = dispatch_semaphore_create(1) 

    evaluateJavaScript(script) { (result, error) in 
     if error == nil { 
     if result != nil { 
      print("SUCCESS") 
      completion() 
     } 
     } else { 
     print("ERROR!!!") 
     print(error) 
     print(result) 
     completion() 
     } 
     dispatch_semaphore_signal(semaphore) 
    } 

    let timeout = dispatch_time_t(10000) 
    dispatch_semaphore_wait(semaphore, timeout) 
    } 
} 

JSがなかったかのようにページがまだ時々ロードするので、私はそれが動作していないことを知っています。プロセスを同期させるのに似たことはありますか?

+0

webView(wevView:didFinishNavigation:)内からあなたのメソッドを呼び出すことができます読み込まれたときに通知を受けるために定義することができます。再定義問題。間違った方法で問題を解決しようとしている可能性があります。あなたのアプローチを再考し、それに対して非同期性で作業してみてください。現在のスレッドをブロックすることはめったに最善の解決策ではありません。 –

+0

@InfinityJamesしかし、 'WKNavigationDelegate'で利用できるコールバックは、私がこのメソッドを呼び出すことができるように自由を与えません。 – Edmund

+0

私はそれを正しく理解しているかどうかわかりませんが、Webビューがロード完了するまで待ってからJSを実行してください。 –

答えて

1

あなたはWKNavigationDelegateWKWebViewにページが

class Controller: UIViewController, WKNavigationDelegate { 

    @IBOutlet var webView: WKWebView! 

    override func viewDidLoad() { 
     self.view = webView 
     webView.navigationDelegate = self 
    } 

    func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) { 
     print("page loaded") 
     // <--- call your method from here 
    } 
} 

あなたは今、私は老いたコバヤシマルを示唆している

関連する問題