Firebase非同期ダウンロード後にラベルを正しく更新するために、さまざまな組み合わせを試してみるのに楽しいカップルを費やしました。同じ問題がhereとhereとなっています。明確な修正のようですが、私は間違ったことをしており、正しい方向に私を向ける助けを感謝します。iOSラベルでもメインスレッドからテキストが更新されない
基本的な流れはビューロードです。データは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"
}
}
編集UPDATE:上記のコードの呼び出しがviewDidAppear(から来ています)。 viewDidLayoutSubviews()から呼び出すと更新されません。
デバッグから私はラベルの更新が呼び出されていることは知っていますが、何も変わりません。シンプルなもののような気がするが、私は行方不明だが、私は立ち往生している。あなたのアイデアをありがとう。
'DispatchQueue.main.async'で直接updateラベルを呼び出し、' DispatchQueue.main.async'でself.loadDataForView()を呼び出さないでください。 – nynohu
@nynohu同じである必要がありますが、修正するかどうか試してみる価値はありますが、このコードの問題は見られません – Tj3n
試しましたか?私はあなたが持っているのと同じ問題を抱えていました。私はそれをメインスレッドの直接更新ビューで呼び出すことで修正しました。 – nynohu