ker*_*lda 11 ios firebase swift firebase-realtime-database
我正在尝试从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)
})
}
Run Code Online (Sandbox Code Playgroud)
iam*_*rak 12
仅对数组使用reverse()不足以涵盖所有内容.您需要考虑以下不同的事情:
在检索数据时限制,使用append()然后reverse()来节省时间.您不需要每次都删除所有数组.
滚动触发器或willDisplay单元格方法加载
开始吧.您可以为帖子时间戳或全局日期/时间创建子项.为了提供类似Instagram的几秒钟,我建议你使用UTC时间.所以我会这样称呼:(timeUTC)
要对所有帖子进行排序,请使用自1970年以来的时间戳.因此,我将调用此(时间戳),然后您还可以将另一个节点作为(reversedTimestamp)添加 - 前缀到时间戳.所以当你对这个节点使用queryOrdered时.您可以使用最新的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)
Run Code Online (Sandbox Code Playgroud)
+0000意味着它是世界时,请看http://time.is/tr/UTC
2.获取自1970年时间戳以对Swift 3中的帖子进行排序:
let timestamp = (Date().timeIntervalSince1970 as NSString).doubleValue
let reversedTimestamp = -1.0 * timestamp
Run Code Online (Sandbox Code Playgroud)
现在,您可以将它们保存在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"
},
Run Code Online (Sandbox Code Playgroud)
我将检索五个五个帖子,所以我在查询限制(toFirst:5)中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)
})
}
})
Run Code Online (Sandbox Code Playgroud)
如果用户到达最新帖子,您可以使用willDisplay下面的方法处理它,然后您可以调用loadMore函数.
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if self.posts.count - 1 == indexPath.row {
// call loadMore function.
}
}
Run Code Online (Sandbox Code Playgroud)
在loadMore()函数中,您可以处理最新帖子的时间戳,然后处理开始结束查询,这样您就可以轻松地继续下一个前5个帖子,同时在数组之前附加.
对于Swift 3转换格式不错,看看这里:Swift 3 - UTC到时间前标签,思考12h/24h设备时间变化
| 归档时间: |
|
| 查看次数: |
10701 次 |
| 最近记录: |