Swift / Firebase - 按日期对tableview中的帖子进行排序

时间:2016-05-08 18:12:32

标签: swift sorting firebase tableview

基本上我正在尝试创建一个类似Twitter的应用程序,显示您关注的人的状态更新,按日期排序,就像推特一样。我怎样才能做到这一点?我有用于在表格视图中显示帖子的代码,但是排序完全混乱并且看起来很随机。我有一个名为posts的路径,带有autoID路径,包含消息,日期和发件人。如果没有按照新的>顺序显示日期,这怎么可能呢?旧,但也显示消息和发件人?

提前致谢。

root
  posts
    autoID
      sender
      message
      timestamp
 users
    UID
     username

3 个答案:

答案 0 :(得分:3)

问题有点不清楚,但如果你想填充tableView,你需要从Firebase获取数据,填充数组(dataSource),然后重新加载tableView。

首先,我们需要设置一个.ChildAdded观察器来将数据加载到messagesArray中,该消息用作tableView数据源

class AppDelegate: NSObject, NSApplicationDelegate {

   var messagesArray = [[String:String]]() //an array of dicts, tableView datasource
   var initialLoad = true

以及最初加载数据然后查看添加的消息的代码

messagesRef.observeEventType(.ChildAdded, withBlock: { snapshot in

  let dict = [String: String]()
  dict["date"] = snapshot.value("date")
  dict["msg"] = snapshot.value("message")
  dict["sender"] = snapshot.value("sender")

  self.messagesArray.append(dict)

  if ( self.initialLoad == false ) { //upon first load, don't reload the tableView until all children are loaded
    self.itemsTableView.reloadData()
  }
})

然后 - 这是很酷的部分......

    //this .Value event will fire AFTER the child added events to reload the tableView
    //  the first time and to set subsequent childAdded events to load after each child
   //   is added in the future
    messagesRef.observeSingleEventOfType(.Value, withBlock: { snapshot in

        print("inital data loaded so reload tableView!  \(snapshot.childrenCount)")
        self.messagesTableView.reloadData()
        self.initialLoad = false
    })

使用上面的代码,数据的顺序是按键 - 如果这些键是由Firebase生成的,它们将按照创建消息的顺序顺序。

然后从messagesArray中填充您的tableView,您可以选择要放入tableView列的日期,消息和发件人,或者您希望填充您的cellView。

你的另一个要求就是让它们按日期排序,降序。这是一个非常棒的问题,在这里有答案 - 这是一个两部分问题,但你会看到思考过程。

In Firebase, how can I query the most recent 10 child nodes?

您还希望利用Firebase查询功能来获取您想要的特定数据,而不是上面的常规数据......

messagesRef.queryOrderedByChild("date").observeEventType(.ChildAdded, withBlock: {
  snapshot in
    //create a dict from the snapshot and add to tableview
})

答案 1 :(得分:0)

您目前正在收到Firebase中的所有帖子,这些帖子可能会按照添加的顺序排序,您可以按照这样的方式指定结果的顺序,

firebase.queryOrderedByChild("posts/publishedDate").observeEventType(FEventType.Value, withBlock: { (snapshot:FDataSnapshot!) in
   self.firebaseUpdate(snapshot)
})

我在使用Objective-c示例firebase提供的时候直接转换了它,所以可能需要一些调整。

您也可以在收到结果后对本地结果进行排序,但您可能需要将listOfMessages作为包含排序字段的字典,类或结构数组,然后您可以使用谓词或过滤器对数组进行排序。

Sorting an array using filter

Firebase Retreiving data

答案 2 :(得分:0)

对于Swift 3:

更改。 queryOrderedByChild(' timestamp') .queryOrdered(byChild:" timestamp")