2016-11-11 1 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" 
    } 
} 

편집 업데이트 : 다음과 같이 내가 시도 한 대표의 반복은 위의 코드를 호출은 viewDidAppear에서오고있다(). viewDidLayoutSubviews()에서 호출해도 업데이트되지 않습니다.

디버깅에서 레이블 업데이트가 호출되는 것을 알고 있지만 아무것도 변경되지 않습니다. 내가 누락 된 단순한 느낌이 들지만, 나는 붙어있다. 당신의 아이디어에 감사드립니다.

+0

'DispatchQueue.main.async'에서 update label을 직접 호출해야하고,'DispatchQueue.main.async'에서 self.loadDataForView()를 호출하지 말아야합니다. – nynohu

+0

@nynohu 동일해야하지만 수정해야하는지 확인해 볼 가치가 있습니다.이 코드에서 문제가 보이지 않습니다. – Tj3n

+0

시도해 보셨습니까? 나는 당신이 가지고있는 것과 같은 문제를 겪었고, 메인 스레드에서 직접 호출 뷰로 호출을 수정했습니다. – nynohu

답변

0

이렇게하면 혼동을 일으키는 잘못된 라벨링에 대한 교훈이되었습니다. 실제로 변경되는 레이블은 레이블이 아니라 단추입니다. webLabel이라는 이름으로해서는 안됩니다! self.websiteLabel.setTitle ("Go to Website", for : .normal)으로 제목이 변경되면 모든 것이 예상대로 작동합니다.

0

저는 DispatchQueue.main.async 비트가 필요 없다고 확신합니다. self.loadDataFromView()에 전화하여 도움이되는지 확인하십시오.

관련 문제