指示tableView indexPath何时是最后一个

时间:2015-11-01 01:10:56

标签: swift parse-platform

我正在实现显示帖子部分,我希望它做分页,我得到了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)


        }
    }
}

1 个答案:

答案 0 :(得分:0)

首先让我们解决分页问题。现在分页是不可撤销的,但它确实要求您的服务器接受页面,以便它知道返回哪组结果。例如,如果您在群组大小为20的结果中有100个结果,则在您的网址请求中,您必须指定是否需要页面0 - 4

我个人建议使用开源库为您处理分页。看看MMRecord,它确实有一些分页支持。如果您有野心想要并且想要自己实施它,那么您需要构建一些网络服务,最好建立在跟踪上次请求的页面的AFNetworking之上。

在swift中,看起来像这样:

NetworkManager.GET('http://someURI', parameters: [:], page: 0)

不知何故,你必须保持下一个页面的状态。正如建议here一样,更好的设计是使用协议和某种数据源包装器,从客户端抽象出机制。

现在您还询问了如何检测表视图何时滚动到末尾,以便您可以触发网络请求。一种方法是简单地观察scrollViewDidScrollUITableView继承自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 {}