2016-09-26 14 views
0

SwiftとFirebaseを使ってチャットアプリケーションを作成する方法について、簡単に私はUdemyのコースに参加しました。Swift 3 Firebaseアップデートコードの変換 - ソート

しかし、私は1週間後にコースを修了しました。これは数ヶ月前のことです。それ以来、FirebaseとSwiftの両方のアップデートがありました。私は現在、古いコードの一部を新しいコードに変換することに苦労しています。

ここで私は、現在で苦労していたコードされています

func loadRecents() { 

     firebase.child("Recent").queryOrdered(byChild: "userId").queryEqual(toValue: FIRAuth.auth()!.currentUser?.uid).observe(.value) { (snapshot:FIRDataSnapshot) in 

      self.recents.removeAll() 

      if snapshot.exists() { 

       if let values = snapshot.value as? [String:AnyObject] { 

        let sorted = (values as! NSArray).sortedArray(using: [NSSortDescriptor(key: "date", ascending: false)]) 


        for recent in sorted { 

         self.recents.append(recent as! NSDictionary) 
         self.conversationTableView.reloadData() 

        } 

       } 

       self.conversationTableView.reloadData() 

      } 

      self.conversationTableView.reloadData() 

     } 

     self.checkUnread() 

    } 

だから、これは単に私が単に日を通してそれを並べ替えていますのtableView内のすべての「チャット」を表示するコード、昇順であります偽です。

私が行った変更は、古いsnapshot.value.allValuessnapshot.value as? [String:AnyObject]に変換するだけです。クエリはログインしたアカウント(FIRAuth.auth().currentUser!.uid)によってソートされます。

ただし、このコードを作成するたびにエラーが発生するため、このコードは推奨されていません。そして私はそれが以前のバージョンで働いたという事実を知っています。

これはエラーです:

Thread 1: EXC_BAD_INSTRUCTION 

と(であるかもしれない)ことが必要であり、それは完全に私は、現在のコードを台無しにしていることを起これば、ここでは完全な古いコードです:

は、
func loadRecents() { 
     firebase.child("Recent").queryOrderedByChild("userId").queryEqualToValue(FIRAuth.auth()!.currentUser!.uid).observeEventType(.Value, withBlock: { 
      snapshot in 

      self.recents.removeAll() 

      if snapshot.exists() { 

       let sorted = (snapshot.value!.allValues as NSArray).sortedArrayUsingDescriptors([NSSortDescriptor(key: "date", ascending: false)]) 

       for recent in sorted { 

        self.recents.append(recent as! NSDictionary) 

        //add functio to have offline access as well, this will download with user recent as well so that we will not create it again 

        firebase.child("Recent").queryOrderedByChild("chatRoomID").queryEqualToValue(recent["chatRoomID"]).observeEventType(.Value, withBlock: { 
         snapshot in 
        }) 

       } 

      } 

      self.tableView.reloadData() 
     }) 

     self.checkUnread() 

    } 

これを回避/修正する方法についてのアイデアはありますか?ヘルプは非常に高く評価されます。

答えて

0

あなたがなどの値=(snapshot.value)を許可すれば辞書()

を使用する必要があります!辞書

+0

奇妙なことに、これは問題を解決していないようです。うーん.. – askaale

0

私はFirebase構造を知っているが、データは次のようになります場合は、ここソリューションですません。

[ 
    ("post_42", ["date": "2016-09-16"]), 
    ("post_12", ["date": "2016-09-19"]), 
    ("post_87", ["date": "2016-09-04"]) 
] 

、日付ごとにソートされたデータを印刷するためのいくつかのコードを(これはブロック内で行くだろう/閉鎖)

let dict = snapshot!.value as! [String:[String:String]] 

//print the unordered data from the dictionary 
for item in dict { 
    print(item) 
} 

let sortedArray = Array(dict).sorted { $0.1["date"]! < $1.1["date"]! } 

//print the data sorted by date    
for sortedItem in sortedArray { 
    print(sortedItem) 
}