最佳答案
我有一系列的关键字,可以为我的社交网络发布对象,比如 so/post/id/(post info)
当我加载文章时,我使用 observeSingleEventOfType(.Value)
方法加载/post/0,然后加载/post/1等。
我使用 lazyTableView
一次加载30个,它是相当慢的。有没有什么方法可以让我使用其中一种查询方法,或者其他方法使它更快,即使我必须重新构造我的 JSON 树中的数据。
我来自解析重新实现我的应用程序,到目前为止的经验是相当不错的。只是有一件事让我有点纠结。提前谢谢你的帮助!
编辑:
func loadNext(i: Int) {
// check if exhists
let ideaPostsRef = Firebase(url: "https://APPURL")
ideaPostsRef.childByAppendingPath(i.description).observeSingleEventOfType(.Value, withBlock: {
(snapshot) in
if i % 29 == 0 && i != 0 && !self.hitNull { return }
// false if nil
// true if not nil
if !(snapshot.value is NSNull) {
let postJSON = snapshot.value as! [String: AnyObject]
print("GOT VALID \(postJSON)")
let post = IdeaPost(message: postJSON["message"] as! String, byUser: postJSON["user"] as! String, withId: i.description)
post.upvotes = postJSON["upvotes"] as! Int
self.ideaPostDataSource.append(post)
self.loadNext(i + 1)
} else {
// doesn't exhist
print("GOT NULL RETURNING AT \(i)")
self.doneLoading = true
self.hitNull = true
return
}
}
}
这个递归函数实际上运行从 firebase 获取关键字 i 的值。如果它是 NSNULL 它知道这是最后一个可能的文章加载,永远不会再做。如果 NSNULL 没有被命中,而是被 i % 29 == 0
命中,那么它将作为基本情况返回,因此一次只加载30个帖子(0索引)。当我将 doneLoading
设置为 true
时,使用属性观察器调用 tableView.reloadData()
。
下面是我正在获取的数组的样例
"ideaPosts" : [ {
"id" : 0,
"message" : "Test",
"upvotes" : 1,
"user" : "Anonymous"
}, {
"id" : 1,
"message" : "Test2",
"upvotes" : 1,
"user" : "Anonymous"
} ]