Получить только 5 пользователей одновременно: Firebase [как Instagram]
Последние несколько дней я пытался создать Instagram-подобный канал для своего приложения. Чтобы быть более конкретным: загружайте новые сообщения (5) каждый раз, когда пользователь обновляет канал снизу.
В настоящее время я использую Firebase для хранения и отображения моих данных.
Мой код до сих пор выглядит так:
var ref:FIRDatabaseReference!
var dict = [String:Any]()
var posts = [[String:Any]]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
ref = FIRDatabase.database().reference()
// Do any additional setup after loading the view, typically from a nib.
}
override func viewDidAppear(animated: Bool) {
loadValues()
}
func loadValues() {
dict.removeAll()
posts.removeAll()
ref.child("posts").queryOrderedByChild("timeCreated").queryLimitedToLast(5).observeEventType(.ChildAdded) { (snapshot:FIRDataSnapshot) in
if let timeCreated = snapshot.value!["timeCreated"] as? Int {
self.dict["timeCreated"] = timeCreated
}
if let postText = snapshot.value!["postText"] as? String {
self.dict["postText"] = postText
}
self.posts.append(self.dict)
self.tableView.reloadData()
}
}
func scrollViewDidScroll(scrollView: UIScrollView) {
if (scrollView.contentOffset.y + scrollView.frame.size.height) >= scrollView.contentSize.height {
//tableView.tableFooterView!.hidden = true
let pagingSpinner = UIActivityIndicatorView(activityIndicatorStyle: .Gray)
pagingSpinner.startAnimating()
pagingSpinner.hidesWhenStopped = true
pagingSpinner.sizeToFit()
tableView.tableFooterView = pagingSpinner
//loadMore(5)
} else {
let pagingSpinner = UIActivityIndicatorView(activityIndicatorStyle: .Gray)
pagingSpinner.stopAnimating()
pagingSpinner.hidesWhenStopped = true
pagingSpinner.sizeToFit()
pagingSpinner.hidden = true
tableView.tableFooterView = pagingSpinner
tableView.tableFooterView?.hidden = true
}
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return posts.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
if let postText = posts[indexPath.row]["postText"] as? String {
cell.textLabel!.text = postText
}
return cell
}
func loadMore(increment:Int) {
//What should go in here?
}
Итак, что я пытаюсь сделать здесь - это то, что я определяю, когда пользователь прокрутил до конца (в моей функции scrollViewDidScroll. Затем я просто отображаю индикатор активности и вызываю функцию loadMore (5), где 5 - это сумма новых сообщений, которые я хочу отображать.
Так что здесь у меня две проблемы. Переменная timeCreated - это просто отметка времени, где у меня есть десять записей (1-10, где 10 - самое новое, а 1 - самое старое). С этим кодом, который у меня есть сейчас, tableView отображает данные в возрастающем представлении, начиная с 5 и заканчивая 10.
Я попытался изменить массив словарей (post), просто выполнив .reverse () перед добавлением dict в функцию loadValues. так как я просто хочу, чтобы отображалось 10 вверху и 5 внизу.
Вторая проблема, с которой я столкнулся, заключается в том, что я не могу найти хороший и эффективный способ обновления tableView (добавив еще 5 записей). Я попытался просто иметь глобальную переменную со значением по умолчанию 5, а затем в loadMore просто добавить ее на пять, а затем выполнить removeAll () как для dict, так и для сообщений - без удачи (tableView прокручивает до верх, чего я не хочу). Я также попытался поиграть как с queryLimitedTolast, так и queryLimitedToFirst, где я в итоге продублировал некоторые данные.
Другими словами, мне также нужно убедиться, что пользователь действительно может загрузить 5 новых уникальных сообщений (или, например, 3, если осталось только 3 уникальных сообщения).
У кого-нибудь есть идеи о том, как бы я подошел к этому?
Помощь будет принята с благодарностью, так как я боролся с этим в течение последних двух дней.