【问题标题】:"How to retrieve an url from Firebase Database BEFORE load WebView in Swift?"“如何在 Swift 中加载 WebView 之前从 Firebase 数据库中检索 url?”
【发布时间】:2019-04-29 17:10:00
【问题描述】:

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

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

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

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

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”...这对我来说很奇怪

【问题讨论】:

  • 在 Firebase 中,数据库观察方法是异步的。所以; print (nextUrl)print ("webview is about to load") 之后调用。

标签: ios swift firebase-realtime-database webview wkwebview


【解决方案1】:

您应该在 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()

【讨论】:

  • 好的,非常感谢!我会尝试。你能解释一下为什么要这样做吗?
  • 哦是的对不起......因为你在firebase网络调用它就像异步工作之后立即加载webView,所以webView尝试加载nextUrl是否为空,以防止你必须等待的异步行为nextUrl 或者你应该在空军基地回调中加载 webView
  • 哎呀,另一个问题:当我将数据库中的 url 更改为有效 url 时,nextUrl 出于奇怪的原因变为 nil,我的应用程序崩溃了……你知道吗?
  • 当我将数据库中的 url 更改为有效 url 时,由于奇怪的原因 nextUrl 变为 nil 并且我的应用程序崩溃......你有什么想法吗?@Abu Ul Hassan
  • 我没有遇到这个问题,可能是您输入的是绝对网址而不是网址...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
  • 2020-11-25
  • 1970-01-01
  • 2016-02-18
  • 2018-09-04
  • 1970-01-01
相关资源
最近更新 更多