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