2016-11-11 3 views
0

Firebase非同期ダウンロード後にラベルを正しく更新するために、さまざまな組み合わせを試してみるのに楽しいカップルを費やしました。同じ問題がherehereとなっています。明確な修正のようですが、私は間違ったことをしており、正しい方向に私を向ける助けを感謝します。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()から呼び出すと更新されません。

デバッグから私はラベルの更新が呼び出されていることは知っていますが、何も変わりません。シンプルなもののような気がするが、私は行方不明だが、私は立ち往生している。あなたのアイデアをありがとう。

+0

'DispatchQueue.main.async'で直接updateラベルを呼び出し、' DispatchQueue.main.async'でself.loadDataForView()を呼び出さないでください。 – nynohu

+0

@nynohu同じである必要がありますが、修正するかどうか試してみる価値はありますが、このコードの問題は見られません – Tj3n

+0

試しましたか?私はあなたが持っているのと同じ問題を抱えていました。私はそれをメインスレッドの直接更新ビューで呼び出すことで修正しました。 – nynohu

答えて

0

これは混乱の原因となる誤ったラベル付けの教訓となりました。実際に変更されるラベルはラベルではなく、ボタンです。 websiteLabelという名前にしてはいけません! self.websiteLabel.setTitle( "Go to Website"、for:.normal)でタイトルを変更すると、すべてが期待どおりに機能しました。

0

DispatchQueue.main.asyncビットは必要ありません。ちょうどself.loadDataFromView()に電話してみてください。

関連する問題