Comment commandz-vous correctement datatables de Firebase par ordre chronologique

J'essaie de order mes données à partir de Firebase afin que le post le plus récent soit en haut (comme Instagram), mais je n'arrive tout simplement pas à le faire fonctionner correctement. Dois-je utiliser un horodatage de server? Y a-t-il un champ "createdAt"?

func getPosts() { POST_REF.observeEventType(.Value, withBlock: { snapshot in guard let posts = snapshot.value as? [Ssortingng : [Ssortingng : Ssortingng]] else { print("No Posts Found") return } Post.feed?.removeAll() for (postID, post) in posts { let newPost = Post.initWithPostID(postID, postDict: post)! Post.feed?.append(newPost) } Post.feed? = (Post.feed?.reverse())! self.tableView.reloadData() }, withCancelBlock: { error in print(error.localizedDescription) }) } 

En utilisant seulement reverse () pour votre tableau n'est pas assez moyen de tout englober. Il y a différentes choses auxquelles vous devez penser:

  • Limite lors de la récupération des données, utilisez append () puis reverse () pour gagner du time. Vous n'avez pas besoin de supprimer tous les arrays à chaque fois.

  • Déclenchement du défilement ou chargement de la méthode de cellule willDisplay

Commençons. Vous pouvez créer un enfant pour l' horodatage de vos publications ou la date / heure étant global. Pour fournir comme secondes Instagram , semaines je vous conseille d'utiliser l' heure UTC . Donc, je vais appeler ceci: ( timeUTC )

Pour sortinger tous vos messages, utilisez l'horodatage depuis 1970 . Donc je vais appeler cela ( horodatage ) et ensuite vous pouvez garder un autre noeud comme (reverseTimestamp) en ajoutant – prefix à timestamp. Donc, lorsque vous utilisez queryOrdered sur ce noeud. Vous pouvez gérer les 5 derniers messages en utilisant yourQuery.queryLimited(toFirst: 5) .

1.Get UTC date / heure pour le noeud timeUTC dans Swift 3:

  let date = Date() let formatter = DateFormatter() formatter.locale = Locale(identifier: "en_US_POSIX") formatter.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZ" formatter.timeZone = TimeZone(abbreviation: "UTC") let utcTimeZoneStr = formatter.ssortingng(from: date) 

+0000 signifie que c'est l'heure universelle, regardez http://time.is/tr/UTC

2.Get depuis 1970 horodatage pour sortinger les messages dans Swift 3:

 let timestamp = (Date().timeIntervalSince1970 as NSSsortingng).doubleValue let reversedTimestamp = -1.0 * timestamp 

Maintenant, vous pouvez les save sur vos messages Firebase comme ceci.

 "posts" : { "-KHLOy5mOSq0SeB7GBXv" : { "timestamp": "1475858019.2306" "timeUTC" : "2012-02-04 12:11:56 +0000" }, "-KHLrapS0wbjqPP5ZSUY" : { "timestamp": "1475858010.1245" "timeUTC" : "2014-02-04 12:11:56 +0000" }, 

Je vais récupérer cinq par cinq post, donc je fais queryLimited (toFirst: 5) dans viewDidLoad :

 let yourQuery = ...queryOrdered(byChild: "reverseTimestamp") .queryEnding(atValue: "\(self.pageOnTimestamp)", childKey: "reverseTimestamp") yourQuery.observeSingleEvent(of: .value, with: { (snapshot) in if snapshot.value is NSNull { print("There is no post.") } else { yourQuery.queryLimited(toFirst: 5).observeSingleEvent(of: .value, with: { (snapshot) in self.posts.removeAll(keepingCapacity: true) for (i, snap) in snapshot.children.enumerated() { if let postAllDict = snapshot.value as? [Ssortingng: AnyObject] { if let postDict = postAllDict[(snap as AnyObject).key as Ssortingng] as? [Ssortingng: AnyObject] { let post = Post(key: (snap as AnyObject).key as Ssortingng, postDict: postDict) self.posts.append(post) } } } completion(true) }) } }) 

Si l'user a atteint le dernier message, vous pouvez le gérer avec la méthode willDisplay comme ci-dessous, puis vous pouvez appeler la fonction loadMore.

 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { if self.posts.count - 1 == indexPath.row { // call loadMore function. } } 

Dans la fonction loadMore (), vous pouvez gérer l'horodatage de la dernière publication, puis la requête de début-fin comme cela, de sorte que vous pouvez facilement continuer avec les 5 premiers messages suivants tout en ajoutant avant le tableau.

Pour une conversion de Swift 3 aussi bien formatée, jetez un coup d'oeil ici: Swift 3 – UTC à l'label il y a quelque time, en pensant 12h / 24h changements d'heure de l'appareil

Basé sur la réponse de @tobeiosdev je définis ma structure de données comme ceci:

 "posts" : { "-KcOa8GXBl08V-WXeX8P" : { "author" : "@giovanny.piñeros", "hashtags" : [ "Hello", "World" ], "text" : "Hola Mundo!!!!!", "timestamp" : 5.08180914309278E8, "title" : "Hello World", "userid" : "hmIWbmQhfgh93" } 

Comme vous pouvez le voir, j'ai ajouté un atsortingbut timestamp, lorsque j'interroge mes données avec un événement enfant ajouté, je transmets ces données à un object post, puis j'ajoute cet object à un tableau de messages à partir duquel ma table va se nourrir:

  self.posts.append(post) self.posts.sort(by: {$0.timestamp! > $1.timestamp!}) self.tableViewFeed.reloadData() 

Avec la méthode de sorting, j'ai réussi à order mes données dans l'ordre désiré des messages, du plus récent au plus ancien. J'espère que cette approche pourrait aider n'importe qui :).