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

Does Siesta provide any special handling for pagination?

Siesta 如何处理分页 URL?是否有将多页结果作为单一资源进行管理的机制?

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

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

例子

这在实践中意味着什么?例如,假设您的 API returns 和 X-Next-Page header(Github’s pagination scheme 的简化版本),并且您想将结果合并为一个无限滚动 table 视图。

你可能会这样做:

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 的缓存

如果您有复杂的更新方案并希望 fine-grained 控制请求的内容以及结果在内存中的保存方式,那么您可能希望完全绕过 Siesta 的资源缓存。但是,您不需要放弃午睡来做到这一点!要退回到更传统的 request-based 方法,请使用 Resource.request(…) 方法而不是 load()loadIfNeeded():

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

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