我正在尝试从Firebase订购数据,因此最近的帖子位于顶部(如Instagram),但我无法使其正常运行。我应该使用服务器时间戳吗?是否有一个“ createdAt”字段?
func getPosts() { POST_REF.observeEventType(.Value, withBlock: { snapshot in guard let posts = snapshot.value as? [String : [String : String]] 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) }) }
仅对数组使用 reverse() 不足以包含所有内容。您需要考虑不同的事情:
在检索数据时进行限制,请使用 append() ,然后使用 reverse() 可以节省时间。您不需要每次都删除所有数组。
滚动触发器 或 willDisplay单元格方法 加载
开始吧。您可以为帖子的 时间戳记 或 日期/时间创建 全局子对象。为了提供类似 Instagram的 秒数,我建议您使用 UTC时间 。因此,我将其称为:( timeUTC )
要对所有帖子进行排序,请使用 1970年以来的 时间戳。因此,我将其称为( timestamp ),然后您还可以将另一个节点保留为(reversedTimestamp)添加-时间戳的前缀。因此,当您使用 queryOrdered 到此节点时。您可以使用来处理最新的5个帖子yourQuery.queryLimited(toFirst: 5)。
yourQuery.queryLimited(toFirst: 5)
1,在Swift 3中获取timeUTC节点的UTC日期/时间
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.string(from: date)
+0000表示世界通用时间,请访问http://time.is/tr/UTC
2.获取1970年以来的时间戳,以对Swift 3中的帖子进行排序:
let timestamp = (Date().timeIntervalSince1970 as NSString).doubleValue let reversedTimestamp = -1.0 * timestamp
现在,您可以像这样将它们保存在Firebase帖子中。
"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" },
我将五个职位检索五,所以我做 queryLimited(toFirst:5) 在viewDidLoad:
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? [String: AnyObject] { if let postDict = postAllDict[(snap as AnyObject).key as String] as? [String: AnyObject] { let post = Post(key: (snap as AnyObject).key as String, postDict: postDict) self.posts.append(post) } } } completion(true) }) } })
如果用户到达了最新帖子,则可以使用willDisplay以下方法处理它,然后可以调用loadMore函数。
willDisplay
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { if self.posts.count - 1 == indexPath.row { // call loadMore function. } }
在loadMore()函数中,您可以处理最新文章的时间戳,然后像这样进行开始-结束查询,因此您可以轻松地继续下一个前5个文章,同时在数组之前追加。