获取数据,排序数据,然后加载到表格视图(Swift 3:Firebase)

时间:2016-10-20 01:13:07

标签: ios swift sorting firebase firebase-realtime-database

我正在使用Firebase处理应用程序。我想要完成的是从Firebase获取数据,对数据进行排序,然后最终将数据加载到tableView中。

我不会分享我的整个代码,但这基本上就是我希望它如何运作:

 var posts = [PostStruct]()
 var following = [String]()

...

 let databaseRef = FIRDatabase.database().reference()
 for follower in following {
     databaseRef.child("Posts").child(follower).observe(.value, with: {
         DataSnapshot in
             //Parse All The Data...

             self.posts.insert(...)

      }
 }
 self.posts.sort{$0.date.compare($1.date) == .orderedDescending}

 print("Test")

 self.tableView.reloadData()

调用print("Test"),但在请求FIRDatabase之前调用它,这样就告诉我tableView在排序时绝对没有数据。所以,我需要找到一种只在数据库完成请求后才进行排序的方法。

我可以将sort和reload方法放在for语句中,这样可行,但它会使所有内容变得不稳定,而且效率不高。

2 个答案:

答案 0 :(得分:2)

不确定这是否是处理此问题的最佳方法,但您可以添加一个递增的计数器,然后在该计数器等于以下数组的计数后执行排序和重新加载代码。

var counter = 0

let databaseRef = FIRDatabase.database().reference()
for follower in following {
    databaseRef.child("Posts").child(follower).observe(.value, with: {
        DataSnapshot in
         //Parse All The Data...

        counter += 1

        self.posts.insert(...)

        if counter == following.count {
            self.sortPosts()
        }
    }
}

func sortPosts() {
    self.posts.sort{$0.date.compare($1.date) == .orderedDescending}

    print("Test")

    self.tableView.reloadData()
}

答案 1 :(得分:1)

如果这是针对您的youtube教程,我将尝试回答

我认为Donny的解决方案会起作用,你也可以通过回调函数来实现这一点

func getData(handle:@escaping ((Bool) -> Void)){
  let databaseRef = FIRDatabase.database().reference()
  for follower in following {
    databaseRef.child("Posts").child(follower).observe(.value, with: {
      DataSnapshot in
     //Parse All The Data...

      counter += 1

      self.posts.insert(...)

      if counter == following.count {
        handle(true)
      }
    }
  }
}

然后在你调用getData的方法中。

getData(){ ready in 
  self.posts.sort{$0.date.compare($1.date) == .orderedDescending}

  print("Test")

  self.tableView.reloadData()
}