2016-06-17 3 views
2

Firebase 쿼리에서 결과를 검색 할 수 있지만이를 사전으로 검색하여 tableView를 채우는 데 문제가 있습니다. 저는 여기에 쿼리 결과를 저장하고있어 방법은 다음과 같습니다파이어베이스 사전에서 결과를 얻으시겠습니까?

var invites: Array<FIRDataSnapshot> = [] 
func getAlerts(){ 

     let invitesRef = self.rootRef.child("invites") 
     let query = invitesRef.queryOrderedByChild("invitee").queryEqualToValue(currentUser?.uid) 
     query.observeEventType(.Value, withBlock: { snapshot in 

      self.invites.append(snapshot) 
      print(self.invites) 

      self.tableView.reloadData() 
     }) 
    } 

인쇄 self.invites는 다음 반환

[Snap (invites) { 
    "-KKQWErkyuehmbxom8NO" =  { 
     invitedBy = T2k7Bm9G9RNLcHLvLlKApRbnas23; 
     invitee = dRJ1FqctSfTlLF8iO2ddlc9BANJ3; 
     role = guardian; 
    }; 
}] 

내가 문제가있는 tableView 채우기가 있어요. 셀 라벨에 아무 것도 표시되지 않습니다.

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) 

    let inviteDict = invites[indexPath.row].value as! [String : AnyObject] 
    let role = inviteDict["role"] as? String 

    cell.textLabel!.text = role 

    return cell 
} 

아이디어가 있으십니까?

감사합니다.

편집 : 내 기능을 실행 한 후 사전을 콘솔에 인쇄하고 []을 인쇄 중입니다. 가치를 잃는 이유는 무엇입니까?

override func viewWillAppear(animated: Bool) { 
     getAlerts() // inside of function prints values 
     print(self.invites) //prints [] 
    } 

편집 2 : Paul의 솔루션이 작동했습니다. Firebase가 결과를 "듣는다"는 다음 기능을 추가했습니다! 내가 로그인 한 사용자 만 표시 경고에이를 편집 할 수 있습니다, 그러나 이것은 적어도 올바른 방향으로 절 지적했습니다 중포 기지가 비동기이기 때문에

override func viewWillAppear(animated: Bool) { 
     getAlerts() 

     configureDatabase() 
    } 

    func configureDatabase() { 

     // Listen for new messages in the Firebase database 
     let ref = self.rootRef.child("invites").observeEventType(.ChildAdded, withBlock: { (snapshot) -> Void in 
      self.invites.append(snapshot) 
      self.tableView.insertRowsAtIndexPaths([NSIndexPath(forRow: self.invites.count-1, inSection: 0)], withRowAnimation: .Automatic) 
     }) 
    } 
+1

당신은 getAlerts 함수 밖에서 쿼리가 끝난 후 사전이 nil을 반환하지 않는지 확인해야합니다. 나는 같은 문제를 겪고있다. 값은 함수 내에 저장되지만 일단 값을 그대로두면 –

+0

답장을 보내 주셔서 감사합니다. 나는 네가 뭔가있는 것 같아! 방금 내 질문을 업데이트했습니다. 나는 콘솔이 실행 된 후에 그 dict을 콘솔에 출력했고 이제는 [[]'을 출력하고있다. 도대체 무슨 일이야? 이 문제를 어떻게 해결할 수 있습니까? – winston

+0

저는 약 2 일 동안이 문제를 직접 해결하려고 노력해 왔습니다. 나는이 스레드에 매우주의를 기울일 것이다. 다행히 누군가가 해결책을 찾게 될 것입니다. 그 동안 속성 관찰자를 사용해 볼 수 있습니다. 귀하의 사전이 무조건으로 설정되는 곳을 알려줍니다. 오늘 나 자신에 대해 알았다. –

답변

3

비동기 호출에서 테이블보기를 채우는 예제는 friendlychat Firebase codelab을 확인하십시오. 특히, viewDidLoad 및 configureDatabase는 FCViewController.swift에 있습니다.

+1

그게 효과가! 감사! 나는 문제가 해결 된 솔루션으로 업데이트했다. – winston

0

귀하의 배열은 항상 []으로 돌아갑니다. Firebase 클로저 안에 var invites: Array<FIRDataSnapshot> = []을 추가하면 찾고자하는 데이터가 인쇄되지만, 클로저 외부에서 변수를 사용하고 싶을 수도 있습니다. 완료하려면 getAlerts() 함수 내에서 완료를 작성해야합니다. Google 검색을 완료하는 방법을 잘 모르는 경우 질문이 해결됩니다.

관련 문제