【发布时间】:2017-03-25 06:34:00
【问题描述】:
我花了几个小时尝试各种不同的组合,以使标签在 Firebase 异步下载后正确更新其标题。这与here 和here 提出的问题相同。似乎是一个明确的解决方法,但我做错了什么,如果有任何帮助指出我正确的方向,我将不胜感激。
基本流程是视图加载,从 Firebase 下载数据,一些标签会根据下载的数据进行相应更新。我尝试过的一个有代表性的迭代如下:
// Query Firebase.
let detailsRef = self.ref.child("eventDetails")
detailsRef.queryOrdered(byChild: "UNIQUE_ID_EVENT_NUMBER").queryEqual(toValue: eventID).observeSingleEvent(of: .value, with: { snapshot in
if (snapshot.value is NSNull) {
print("error")
}
else {
var tempDict = [NSDictionary]()
for child in snapshot.children {
let data = child as! FIRDataSnapshot
let dict = data.value as! NSDictionary as! [String:Any]
tempDict.append(dict as NSDictionary)
}
self.dictionaryOfRecoDetails = tempDict
self.ParseFirebaseData()
DispatchQueue.main.async {
// This is the function that updates labels and button text in format like self.websiteLabel.titleLabel?.text = "Appropriate String"
self.loadDataForView()
}
}
})
func loadDataForView() {
// Example of the label update that happens within this function.
// Do not show website button if there is no website.
if self.recommendation.recommendationWebsiteUrl == "" || self.recommendation.recommendationWebsiteUrl == nil || self.recommendation.recommendationWebsiteUrl == "NA" {
self.websiteLabel.titleLabel?.text = ""
self.websiteHeight.constant = 0
self.websiteBottom.constant = 0
}
else {
self.websiteLabel.titleLabel?.text = "Go to Website"
}
}
编辑更新:对上面代码的调用来自 viewDidAppear()。如果我从 viewDidLayoutSubviews() 调用它也不会更新。
通过调试,我知道标签更新被调用,但没有任何变化。感觉就像我错过了一些简单的东西,但我被卡住了。谢谢你的想法。
【问题讨论】:
-
你应该直接在
DispatchQueue.main.async中调用更新标签,不要在DispatchQueue.main.async中调用self.loadDataForView()。 -
@nynohu 应该是一样的,但值得一试,看看它是否修复,我没有在这段代码中看到问题
-
你试过了吗?我遇到了和你一样的问题,我通过在主线程中直接调用 update view 来修复它。
-
我调用函数更新标签还是直接在 DispatchQueue.main.async 中更新都没有区别。
-
loadDataForView被调用了多少次?可能是它在包含的if传递的地方被调用一次,因此它将宽度和高度设置为零。然后第二次其实是设置文字,但是自动布局约束还是零?
标签: ios swift asynchronous firebase uilabel