2017-10-30 16 views
1

私はcreateionDateによってオブジェクトの一覧を照会しようとしているfirebaseクエリ順序が正常に動作していない

問題。何らかの理由で、オブジェクトを昇順でフェッチしません。

マイデータ構造

enter image description here

私のコード

func fetchQuest() { 

     guard let uid = selectedUID else {return} 

     let ref = FIRDatabase.database().reference().child("questsByUID").child(uid) 
     let query = ref.queryOrdered(byChild: "CreationDate") 
     query.observeSingleEvent(of: .value, with: { (snapshot) in 


      guard let dictionaries = snapshot.value as? [String: Any] else {return} 
      dictionaries.forEach({ (key, value) in 

       guard let dictionary = value as? [String : Any] else {return} 
       let quest = Quest(uid: uid, dictionary: dictionary) 
       quest.questID = key 
       print("quest name is: ", quest.questName) 
       self.board.append(quest) 

      }) 
      self.collectionView?.reloadData() 
     }) { (err) in 
      print("unable to fetch quest:", err) 
     } 
    } 

マイモデル

class Quest { 

var questID = "" 
let questName: String 
let creatorUID: String 
let creationDate: Date 

init(uid: String, dictionary: [String: Any]) { 
    self.questName = dictionary["questName"] as? String ?? "" 
    self.creatorUID = uid 
    let secondsFrom1970 = dictionary["creationDate"] as? Double ?? 0 
    self.creationDate = Date(timeIntervalSince1970: secondsFrom1970) 
}} 

コンソール出力

クエスト名は次のとおりです。サードクエスト

クエスト名は次のとおりです。第二クエスト

クエスト名は次のとおりです。第四エイダ

からクエスト

クエスト名は次のとおりです。エイダの最初のクエスト

答えて

1

Firebaseデータベースがの大文字と小文字を区別するである場合、クエリを次のように変更してみてください。

let query = ref.queryOrdered(byChild: "CreationDate") 

へ:

let query = ref.queryOrdered(byChild: "creationDate") 

あなたQuestモデルクラス、既に正しいスペルを使用しています。

更新。他の答えで言及されているように、辞書はではなく、の順番で保存されています。したがって、代わりにFIRDataSnapshot.childrenイテレータを使用する必要があります。例えば:

query.observeSingleEvent(of: .value) { 
    (snapshots) in 
    for child in snapshots.children { 
     let snapshot = child as! DataSnapshot 
     guard let dictionary = snapshot.value as? [String : Any] else { return } 
     let quest = Quest(uid: uid, dictionary: dictionary) 
     quest.questID = snapshot.key 
     ... 
    } 
} 

あなたの元のコードがするように、私はまだ同じobserveSingleEventを使用していますのでご注意ください。

+0

出力は昇順ではまだありません。それはランダムに見える –

+0

@JeffreyChangあなたはそうです!別のバグを見つけました...更新された答えを確認してください;) –

1

辞書はキーと値のペアの順序付けられていないコレクションなので、順序が違うと思います。childAddedは、既存の各一回トリガーされ 、

場所のすべての内容を返す値とは異なり:だから私はあなたが規則的に値を取得したいために、あなたはマニュアルに従ってので.childAddedのeventTypeをを使用することができると思います子どもと再び たびに新しい子が

は、あなたがこのようにコードを変更することができ、指定したパスに追加されます。

  1. イベントタイプとしてCreationDate

  2. creationDateへの二次利用 .childAddedの代わり .valueを変更する他の回答の状態として初。

let query = ref.queryOrdered(byChild: "creationDate") query.observe(.childAdded, with: { (snapshot) in...

+0

.childAddedに切り替えた後、firebaseはリスト全体ではなくオブジェクトを1つだけフェッチします。私はそれがこの行.observeSingleEventのためだと仮定します。遅い返事を申し訳ありません。 –

+0

@ JeffreyChangあなたは 'observeSingleEvent'の代わりに' observe'を使うことができます、更新された答えをチェックしてください – 3stud1ant3

関連する問題