"How to retrieve an url from Firebase Database BEFORE load WebView in Swift?"
"How to retrieve an url from Firebase Database BEFORE load WebView in Swift?"
我正在构建一个使用 webView
和 Firebase 作为数据库的应用程序。应该用于加载 webView
的 url 应该来自数据库。
我已经正确地实现了 webView
和 Firebase,但问题是我的 webView 没有加载数据库中的 url,而是加载了 var 声明中声明的 url。
似乎 viewDidLoad 优先调用方法 webView 在关闭之前调用 Database Observe 方法
如果我查看控制台,我可以清楚地看到一切正常,但是应该用于加载 webview
的 url 在 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)
}
}
在控制台中我可以看到 "webview is about to load" 打印在 nextUrl 之前...这对我来说很奇怪
您应该在 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()
我正在构建一个使用 webView
和 Firebase 作为数据库的应用程序。应该用于加载 webView
的 url 应该来自数据库。
我已经正确地实现了 webView
和 Firebase,但问题是我的 webView 没有加载数据库中的 url,而是加载了 var 声明中声明的 url。
似乎 viewDidLoad 优先调用方法 webView 在关闭之前调用 Database Observe 方法
如果我查看控制台,我可以清楚地看到一切正常,但是应该用于加载 webview
的 url 在 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)
}
}
在控制台中我可以看到 "webview is about to load" 打印在 nextUrl 之前...这对我来说很奇怪
您应该在 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()