objective c - How to run WebView.mainFrame.loadRequest synchronously? -
in app i'm trying navigate given url using webview (non visible). however, loading web content happens asynchronously. later processing need wait until web content loaded (including redirections).
i experimented cfrunloopruninmode make wait (or timeout) cannot work available loop modes. kcfrunloopdefaultmode no redirection done , load request stops first address. mode kcfrunloopcommonmodes crashs after load request (swift code, don't have useful error information).
i have registered class frame load delegate know when loaded (even after multiple redirections). need make work while run loop active (it works nicely without). code:
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 webpage failed error \(error.localizeddescription)") } and here code load url 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: // ok. return ""; } } return "invalid url"; } what other ways exist make thread wait load request finish?
note: solution can given both obj-c , swift.
you can use performselector:onthread: in webviewdidfinishload: , didfailloadwitherror: perform task want when webview finishes load.
Comments
Post a Comment