2016-06-20 9 views
1

私はストリングの配列を持っていて、firebaseを通してそれを設定しようとしています。チャットアプリケーションであり、ユーザーが部屋を作成すると、その部屋の名前が付けられます。ユーザーがログインしてランディングページに行くと、参加しているすべての部屋を照会し、テーブルビューを埋めるようにします。 firebaseのドキュメントで私はchildrenCountを見つけましたが、私はそれを動作させるように見えません。これまでに試したことです子供たちの数を数えたスウィフト3のFirebase

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    let ref = firebase.child("users").child(fUID).child("participating") 

    ref.observe(.value, with: { (snapshot: FIRDataSnapshot!) in 
     print(snapshot.childrenCount) 
     rooms.count = snapshot.childrenCount 
    }) 

    return rooms.count 
} 

私はカウントが取得専用プロパティであるというエラーが発生します。 配列数を入力する方法は?

+0

tableview.reloadData()を呼び出す前にvar "room"を初期化する必要があります。関数numberOfRowsInSectionにはコード "return rooms.count"が1行だけ含まれていなければなりません。関数は(例えばviewDidLoadで) –

+1

あなたのコードに問題があるのでこれは 'rooms.count = snapshot.childrenCount'です –

+0

@MazelTovはい問題はその行にあります。 – RubberDucky4444

答えて

6

Firebaseデータが非同期ロード(および同期)されます。これは、あなたには、いくつかのデバッグログを追加するかどうかを確認するのが最も簡単です:

let ref = firebase.child("users").child(fUID).child("participating") 

print("Starting observing"); 
ref.observe(.value, with: { (snapshot: FIRDataSnapshot!) in 
    print("Got snapshot"); 
    print(snapshot.childrenCount) 
    rooms.count = snapshot.childrenCount 
}) 

print("Returning count"); 
return rooms.count 

あなたはこのスニペットを実行すると、ログ出力は次のようになります。

戻る回数

ガットを観察スタートスナップショット

これはおそらくあなたが出力を期待した順序。また、あなたのカウントが決して正しくない理由を説明します。データはまだロードされていないので、カウントできません。

これが、Firebaseリスナがコールバックブロックで動作する理由です。データが同期されるとブロックが呼び出されます。

+0

このようにするのではなく、すべての子供を配列にして、代わりにその数を得ました – RubberDucky4444

2

「部屋」はルームルームの配列であると思います。

配列「部屋」の範囲を設定しようとすると「カウントが取得専用プロパティです」というエラーが発生します。これはできません。

'count'プロパティは読み取り専用アクセスです。 人の言葉では、それはのようです。あなたは袋を持っています。あなたはリンゴをバッグに入れます。あなたは別のリンゴを袋に入れます。今あなたは2つのリンゴを持っています。あなたは「私の袋には2つのリンゴがある」と言うだけではありません。それを修正する

  • あなたは、各スナップショットのタイプ「ルーム」クラスで変数を作成する必要があります。FIRDataSnapshot
  • は部屋にそれを追加します。

例:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

let ref = firebase.child("users").child(fUID).child("participating") 

ref.observe(.value, with: { (snapshot: FIRDataSnapshot!) in 
    print(snapshot.childrenCount) 

    let room = Room() 
    // Use you snapshot(FIRDataSnapshot) to create the data of the room. 
    rooms.append(room) 
}) 

return rooms.count 

}

+0

let room = Room()でエラーが発生しました。未解決の識別子を使用 – RubberDucky4444

関連する問題