首页 > 解决方案 > “如何在 Swift 中加载 WebView 之前从 Firebase 数据库中检索 url?”

问题描述

我正在构建一个使用webViewFirebase 作为数据库的应用程序。应该用于加载的 urlwebView应该来自数据库。

我已经webView正确实现了 Firebase 和 Firebase,但问题是我的 webView 没有加载数据库中的 url,而是 var 声明中声明的 url。

似乎 viewDidLoad 在关闭 Database Observe 方法之前优先调用方法 webView 加载

如果我查看控制台,我可以清楚地看到一切正常,但是应该用于加载的 url 是在加载webview后从数据库中检索出来的webview……这应该在我把检索方法放在之前完成之前完成。 .

class ViewController:  UIViewController {

    var dbRef: DatabaseReference!
    var nextUrl = "https://www.google.co.uk/"

    func retrieveUrl () {
        dbRef = Database.database().reference().child("EXAMPLE")

        dbRef.observe(.value) { (snapshot) in
            let value = snapshot.value as! NSDictionary
            let url = value["url"]!
            self.nextUrl = (url as! String)
            print (nextUrl)
        }
        print ("function observe is called")
    }

    override func viewDidLoad () {
        super.viewDidLoad()
        retrieveUrl()
        print ("webview is about to load")
        let request = URLRequest (url: URL(string: nextUrl)!)
        self.webView.load(request)
        self.webView.addObserver(self, forKeyPath: #keyPath(WKWebView.isLoading), options: .new, context: nil)
    }
}

在控制台中,我可以看到在 nextUrl 之前打印了“webview is about to load”……这对我来说很奇怪

标签: iosswiftfirebase-realtime-databasewebviewwkwebview

解决方案


您应该在 firebase 观察者的回调中加载 webView。

因为你是在firebase网络调用它的异步工作之后立即加载webView,所以webView尝试加载nextUrl是否为空,为了防止类似异步的行为你必须等待nextUrl或者你应该在firebase回调中加载webView做它喜欢下面

class ViewController:  UIViewController {
    var dbRef: DatabaseReference!
    var nextUrl = "https://www.google.co.uk/"
    func retrieveUrl () {
        dbRef = Database.database().reference().child("EXAMPLE")
        dbRef.observe(.value) {
            (snapshot) in
            let value = snapshot.value as! NSDictionary
            let url = value["url"]!
            self.nextUrl = (url as! String)
            print (nextUrl)
            print ("webview is about to load")
            let request = URLRequest (url: URL(string: nextUrl)!)
            self.webView.load(request)
            self.webView.addObserver(self, forKeyPath: #keyPath(WKWebView.isLoading), options: .new, context: nil)
        }
        print ("function observe is called")
    }

    override func viewDidLoad () {
        super.viewDidLoad()
        retrieveUrl()

推荐阅读