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"
}
}
편집 업데이트 : 다음과 같이 내가 시도 한 대표의 반복은 위의 코드를 호출은 viewDidAppear에서오고있다(). viewDidLayoutSubviews()에서 호출해도 업데이트되지 않습니다.
디버깅에서 레이블 업데이트가 호출되는 것을 알고 있지만 아무것도 변경되지 않습니다. 내가 누락 된 단순한 느낌이 들지만, 나는 붙어있다. 당신의 아이디어에 감사드립니다.
'DispatchQueue.main.async'에서 update label을 직접 호출해야하고,'DispatchQueue.main.async'에서 self.loadDataForView()를 호출하지 말아야합니다. – nynohu
@nynohu 동일해야하지만 수정해야하는지 확인해 볼 가치가 있습니다.이 코드에서 문제가 보이지 않습니다. – Tj3n
시도해 보셨습니까? 나는 당신이 가지고있는 것과 같은 문제를 겪었고, 메인 스레드에서 직접 호출 뷰로 호출을 수정했습니다. – nynohu