Siesta是否为分页提供任何特殊处理?

时间:2015-12-24 00:06:33

标签: swift siesta-swift

Siesta如何处理分页网址?是否有一种机制可以将多个结果页面作为单一资源进行管理?

1 个答案:

答案 0 :(得分:4)

Siesta不对分页提供任何特殊处理。分页URL的行为与其他URL一样:每个URL都是唯一的资源。 Siesta没有任何黑魔法将来自不同URL的响应合并到一个资源中。

换句话说,如果您的分页方案看起来像/dingbats?page=3&per_page=10,那么Siesta认为“每页10页的dingbats第3页”是单一资源。如果你的分页方案看起来像/dingbats?since_serial_num=31415&max=20,那么Siesta将有一个资源用于“序列号31415以来最多20个dingbats。”

实施例

这在实践中意味着什么?例如,假设您的API返回X-Next-Page标头(简化的Github’s pagination scheme),并且您希望将结果合并到一个无限可滚动的表视图中。

您可能会这样做:

private var firstPageOfDingbats: Resource?
private var dingbats: [Dingbat] = []
private var dingbatsDisplayed: Int = 1

func resourceChanged(resource: Resource, event: ResourceEvent) {
  refreshPages()
}

func refreshPages() {
  // Naive implementation reconstructs the entire dingats array
  // with each update — which is probably just fine, since array
  // concatenation is cheap.

  dingbats.removeAll()

  var nextPage = firstPageOfDingbats
  while let curPage = nextPage {
    // This is a noop if data is up to date, but triggers a
    // that runs down the list if it needs updating.

    curPage.loadIfNeeded()

    // Assuming you’ve set up a content transformer to parse
    // the response as [Dingbat], you can pull them out of
    // the Resource cheaply.

    dingbats.appendContentsOf(
      curPage.contentAsType(ifNone: [Dingbat]()))

    // Don’t fetch everything if we’ve covered as far as the
    // user has scrolled.

    if dingbats.count >= dingbatsDisplayed {
      break
    }

    // If we have data and there’s another page, keep going!

    nextPage = curPage.optionalRelative(
      curPage.latestData?.header("X-Next-Page"))
  }

  tableView.reloadData()
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  return dingbats.count
}
// etc.

// Add code to increase dingbatsDisplayed and call refreshPages()
// when user scrolls to the bottom

Siesta的缓存使得这些页面的天真遍历运行得非常快,如果已经存在数据且一切都是最新的,但是当事情过时时会触发一系列更新。

例如,如果您知道旧条目永远不会更改,新条目只会出现在顶部,您可以进行更智能的阵列更新。这取决于您使用的特定API及其所做的保证。

绕过Siesta的缓存

如果您有一个复杂的更新方案,并希望精确控制所请求的内容以及结果如何保留在内存中,那么您可能希望完全绕过Siesta的资源缓存。但是,您不需要放弃Siesta来做到这一点!要回归更传统的基于请求的方法,请使用Resource.request(…)方法而不是load()loadIfNeeded()

paginatedResource.request(.GET).success { newData in … }

这使您可以自己管理paginatedResource个请求,同时仍然将Siesta的缓存用于API的其他部分。