Closed. This question is opinion-based 。它目前不接受答案。
想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文来回答。
5年前关闭。
Improve this question
Siesta 如何处理分页 URL?是否有一种机制可以将多页结果作为单个资源进行管理?
如果数据已经存在并且一切都是最新的,Siesta 的缓存使这种对页面的简单遍历运行得非常快,但是当事情过时时会触发级联更新。
例如,如果您知道旧条目永远不会更改,而新条目只会出现在顶部,那么您可以进行更智能的数组更新。这取决于您使用的特定 API 及其提供的保证。
绕过 Siesta 的缓存
如果您有一个复杂的更新方案,并且想要精确控制请求的内容以及结果在内存中的保存方式,那么您可能希望完全绕过 Siesta 的资源缓存。但是,您无需放弃 Siesta 即可做到这一点!要退回到更传统的基于请求的方法,请使用
这让您可以自己管理
想改善这个问题吗?更新问题,以便可以通过 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