2016-06-17 4 views
2

Firebaseクエリから結果を取得することはできますが、辞書として取得してtableViewに取り込むことができません。ここで私は、クエリの結果を格納しています方法は次のとおりです。Firebase辞書の結果を取得しますか?

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 
} 

ありがとうございます!

EDIT:私の機能が実行された後に辞書をコンソールに印刷しました。それは[]です。なぜそれが価値を失うのですか?

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

EDIT 2:Paulのソリューションが機能しました!私は次の機能を追加してFirebaseに結果を "聴く"ようにしました!私がログインしているユーザーのための唯一のショーアラートにこれを編集する必要がありますが、これは、少なくとも正しい方向に私を指摘している: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を返さないことを確認する必要があります。私は同じ問題を抱えてきた。値は関数内に格納されますが、一度放置すると値はnilを返します –

+0

返信いただきありがとうございます。私はあなたが何かにいると思う!私はちょうど私の質問を更新した。私はコンソールが実行された後、コンソールにdictを表示し、今は '[]'を表示しています。一体何が起こっているの?これをどうすれば解決できますか? – winston

+0

私はこの問題を約2日間は自分で解決しようとしてきました。私はこのスレッドに非常に細心の注意を払っています。うまくいけば、誰かが解決策を思いつきます。その間は、プロパティオブザーバを使用して試すことができます。あなたの辞書がどこに設定されていないかを教えてくれます。私は今日それについて自分で学んだ。 –

答えて

3

非同期呼び出しからテーブルビューを取り込む例については、friendlychat Firebase codelabを参照してください。具体的には、viewDidLoadとconfigureDatabaseをFCViewController.swiftに参照してください。

+1

それは働いた!ありがとう!私は解決した問題を解決しました。 – winston

0

あなたの配列は、常に[]を返します。 var invites: Array<FIRDataSnapshot> = []をFirebaseクロージャの内側に追加すると、探しているデータが印刷されますが、変数をクロージャの外側で使用したいと思っています。あなたが完了するためには、getAlerts()機能内で完了を作成する必要があります。あなたがどのように完了するかわからない場合は、Googleの検索を行うと、あなたの質問を解決します。

関連する問題