如何加载更多到collectionview?

时间:2017-03-05 13:02:01

标签: ios swift pagination collectionview

我有一个支持分页的api。

"pagination":{  
  "total":355,
  "totalPages":10,
  "page":1,
  "nextPage":2,
  "nextPageUrl":"http://api..................?page=2" }

我的目标是将nextPageUrl的图像添加到我的collectionview中。 那我该怎么做呢?

任何建议或代码示例?我是swift的新手。非常感谢:)

2 个答案:

答案 0 :(得分:1)

您需要在集合视图的末尾添加一个按钮,以便每次用户按下此按钮时,您再次调用服务器,但是对于下一页。 然后将接收到的数据附加到旧数据,然后调用collectionView.reloadData。您也可以在没有按钮的情况下执行此操作,只需当用户到达集合视图的末尾时,它就会自动启动。

你可以这样做第二个:

if (CGRectGetMaxY(scrollView.bounds) == scrollView.contentSize.height) {
    callToServer()
}

答案 1 :(得分:1)

当用户在集合视图的底部附近滚动时,您可以使其自动化。您可以触发请求在全局线程上加载更多,而不是在准备时使用新数据重新加载集合视图。这种方法需要根据您的需要量身定制。这是伪代码示例(由于问题的标签而在swift中):

class VideoList {
  var dataModel: [SomeDataModelType]
  var isLoadingMore = false

  // .. variables and methods

  func collectionView(_ collectionView: UICollectionView,  willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
      let preloadingTreashold = Int(dataModel.count * 0.75)
      let threasholdReached = indexPath.item >= preloadingTreashold
      let reachedLastElement = indexPath.item == dataModel.count - 1
      if !isLoadingMore {
        loadMore()
      }
  }

// Example function for load more, a little bit pseudocode.
// The idea is only to illustrate the case.
  func loadMore {   
    isLoadingMore = true

    // distpatch loading on global queue, because we don't
    // want to block the main thread
    DispatchQueue.global().async {
      // if your data model is a class You may need to copy it
      // before You alter it, because otherwise, a user interaction
      // can trigger an out of bounds exception or some other kind
      // of nasty problem
      var tmpDataModel = dataModel.copy()

      // load new data model
      var extendedDataModel = loadMore(to: tmpDataModel)

      DispatchQueue.main.async {
        // callback for loaid more completed or reloadData call
        isLoadingMore = false        
      }
    } 
  }

  //  other methods ...
}