仅对数组使用 reverse() 不足以包含所有内容。您需要考虑不同的事情:
让我们开始吧。您可以为您的帖子创建一个孩子 timestamp 或 date/time 是全球性的。为了提供 Instagram 秒,我建议您使用 UTC 时间。所以我称之为:(timeUTC)
要对所有帖子进行排序,请使用 since1970 时间戳。所以我将其称为 (timestamp),然后您也可以将另一个节点作为 (reversedTimestamp) 添加 - 前缀到时间戳。所以当你对这个节点使用 queryOrdered 时。您可以使用 yourQuery.queryLimited(toFirst: 5) 处理最新的 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.获取 since1970 时间戳以在 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"
},
我将检索 5 到 5 个帖子,所以我在 viewDidLoad:
中执行
queryLimited(toFirst: 5)
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函数。
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if self.posts.count - 1 == indexPath.row {
// call loadMore function.
}
}
在 loadMore() 函数中,您可以处理最新帖子的时间戳,然后像这样开始结束查询,因此您可以轻松地继续下一个前 5 个帖子,同时附加到数组之前。
对于 Swift 3 转换格式很好,请看这里:Swift 3 - UTC to time ago label, thinking 12h / 24h device time changes