我正在实现显示帖子部分,我希望它做分页,我得到了Query部分。我的理解是当用户到达tableView中更新的最后一篇文章时,我设置了有限数量的帖子,查询按下一个设置限制获取更多对象。
对于这些,我需要一些东西指示何时在最后一个或最后一个之前到达tableView indexPath。
我搜索了一些,我觉得这很好,但我不知道这意味着什么。
Get notified when UITableView has finished asking for data?
有人能解释一下我的意思是什么(它是如何工作的)以及如何在UITableView的reloadData中进行子类化?
fun reloadData() {
print("begin reload")
super.reloadData()
print("end reload")
}
我添加了我的提取代码,我认为它无法正常工作。
var limit = 10
var skip = 0
func fetchAllObjectsFromParse() {
//empty postArray
postsArray = []
//bring data from parse
let query = PFQuery(className: "Posts")
query.limit = limit
query.orderByDescending("createdAt")
query.findObjectsInBackgroundWithBlock { (objects: [PFObject]?, error) -> Void in
if error == nil && objects != nil{
for object in objects! {
self.postsArray.append(object)
}
if (objects!.count == self.limit){
let query = PFQuery(className: "Posts")
self.skip += self.limit
query.skip = self.skip
query.limit = self.limit
print(self.limit)
print(self.skip)
query.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in
if error == nil && objects != nil {
for object in objects! {
self.postsArray.append(object)
print(objects?.count)
}
}
})
dispatch_async(dispatch_get_main_queue(),{
self.tableView.reloadData()
})
}
}else{
print(error?.localizedDescription)
}
}
}
答案 0 :(得分:0)
首先让我们解决分页问题。现在分页是不可撤销的,但它确实要求您的服务器接受页面,以便它知道返回哪组结果。例如,如果您在群组大小为20的结果中有100个结果,则在您的网址请求中,您必须指定是否需要页面0 - 4
。
我个人建议使用开源库为您处理分页。看看MMRecord,它确实有一些分页支持。如果您有野心想要并且想要自己实施它,那么您需要构建一些网络服务,最好建立在跟踪上次请求的页面的AFNetworking之上。
在swift中,看起来像这样:
NetworkManager.GET('http://someURI', parameters: [:], page: 0)
不知何故,你必须保持下一个页面的状态。正如建议here一样,更好的设计是使用协议和某种数据源包装器,从客户端抽象出机制。
现在您还询问了如何检测表视图何时滚动到末尾,以便您可以触发网络请求。一种方法是简单地观察scrollViewDidScroll
(UITableView
继承自UIScrollView
)并检查contentOffset
是否>= self.tableView.contentSize - self.tableView.frame.size.height
(这将是内容)当表格一直滚动时的偏移量)。但是,您希望应用程序的用户能够保持滚动而不必滚动到底部,等待它加载,然后继续滚动,这样当我们向下滚动3/4时我会发出请求如果您知道请求需要很长时间,那么页面甚至中途。这样,当他们到达底部时,它已经加载了数据,用户永远不会知道差异。
编辑:
除了我的回答,我会为你添加一些建议。 1)看看这个:http://artsy.github.io/blog/2015/09/24/mvvm-in-swift/
它讨论了MVVM设计模式,它更适合保持状态而不是视图控制器中的状态变量。
2)你的函数,fetchAllObjectsFromParse
是一个坏名字,原因有两个。首先,该名称暗示该函数一次性获取所有对象,如果您希望对其进行分页,则不是这种情况。
也许是这样的:
func fetchObjectsForModel(model: String, atPage page: Int, withBlock block: ([PFObejct], NSError?) -> Void {
}
然后创建另一个将生成查询的函数:
func generateQueryWithSkips(skip: Int, limit: Int) -> PFQuery {}