Closed. This question is opinion-based 。它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文来回答。

5年前关闭。



Improve this question




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

最佳答案

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 header (Github’s pagination scheme 的简化形式),并且您希望将结果合并到一个可无限滚动的表 View 中。

你可能会做这样的事情:

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 的其他部分。

关于swift - Siesta 是否为分页提供任何特殊处理?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34445568/

10-12 14:49