iOS标签甚至不会从主线程

时间:2016-11-11 04:15:59

标签: ios swift asynchronous firebase uilabel

我花了几个小时尝试各种不同的组合,以便在Firebase异步下载后正确更新标题。这是herehere引发的同一问题。看起来像一个明确的解决方案,但我做错了什么,并希望任何帮助指向我正确的方向。

基本流程是查看加载,数据从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"
    }
}

EDIT UPDATE:对上面代码的调用来自viewDidAppear()。如果我从viewDidLayoutSubviews()调用它,它也不会更新。

从调试中我知道标签更新正在调用,但没有任何变化。感觉就像我失踪的简单,但我被困住了。谢谢你的想法。

2 个答案:

答案 0 :(得分:0)

我很确定你不需要DispatchQueue.main.async位。只需尝试拨打self.loadDataFromView(),看看是否有帮助。

答案 1 :(得分:0)

这最终成为错误标记导致混淆的一课。实际更改的标签实际上不是标签,而是按钮。不应该被命名为websiteLabel!用self.websiteLabel.setTitle("转到网站",for:.normal)更改标题后,一切都按预期工作。