trjkcg
Last Updated: November 27, 2016
·
1.681K
· artchang
Photo sep 26  14 31 57

Preloading UIWebView or WKWebView in Swift

Description

The key to preloading a WebView (either UIWebView or WKWebView), is to call viewDidLoad before the view appears. The trick is that in viewDidLoad you have the WKWebView or UIWebView ready to execute a loadRequest ahead of time. The first controller the app launches should perform the preload kick off.

Steps:

  1. In your viewDidLoad override for the WebView controller, set the url and load the request (you can async this request to a background thread, but know that the request still happens in the main thread asynchronously, it shouldn't block).
  2. In the first controller (such as a MainTabBar or some intro screen you have), you will call the viewDidLoad of the WebView. Let's assume you do this in a UITabBarController. The controller YourWebViewController you see is a reference to your webview controller.

UITabBarController

override func viewDidLoad() {
    super.viewDidLoad()
    // getWebViewController() is a helper that gets the right controller. You can implement this however you want, but you should
    //    easily be able to get this from the viewControllers on a UITabBarController or any other ViewController
    if let webViewController = getWebViewController() {
        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            // this will asynchronously call the viewDidLoad, but will not layout everything yet and will not block the main thread
            webViewController.view.setNeedsLayout()
            // do not call webViewController.view.layoutIfNeeded() here, because that will block the main thread in a RELEASE mode, which sucks big time
        )}
      }
    }

YourWebViewController

override func viewDidLoad() {
  super.viewDidLoad()
  let url = "https://priime.com/some/great/endpoint"
  let request = NSURLRequest(URL: url)
  // This webView is the UIWebView or WKWebView
  webView.loadRequest(request)
}
Say Thanks
Respond