测试已测试 | ✗ |
语言语言 | SwiftSwift |
许可证 | 自定义 |
发布最新发布 | 2017年7月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✓ |
由 Chris Simpson 维护。
🐧 Linux 已准备就绪
SwiftPaginator 是一个基于块的 Swift 类,帮助管理分页资源。受到 NMPaginator 这个 Objective-C 类的启发。SwiftPaginator 充分利用 blocks 和泛型,因此不需要 subclassing 和 delegates。
您可以使用 Swift Package Manager 通过添加正确的描述到您的 Package.swift
文件中来安装 SwiftPaginator
import PackageDescription
let package = Package(
name: "YOUR_PROJECT_NAME",
targets: [],
dependencies: [
.Package(url: "https://github.com/apocolipse/SwiftPaginator.git", versions: "1.0.0" ..< Version.max)
]
)
注意,Swift Package Manager 仍在早期设计和开发阶段,有关更多信息,请查看其 GitHub 页面
将 SwiftPaginator.swift
复制到您的项目中
虽然基于 NMPaginator,但 SwiftPaginator 不需要 subclassing 或委托。使用泛型和 blocks,Paginator
类会为您处理所有事情。
import SwiftPaginator
let source = [["one", "two"], ["three", "four"]]
简单示例
let stringPaginator = Paginator<String>(pageSize: 2, fetchHandler: { (paginator, page, pageSize) in
paginator.receivedResults(source[page], total: 4)
}, resultsHandler: { (_, _) in
self.tableView.reloadData()
})
更完整的示例
let stringPaginator = Paginator<String>(pageSize: 2, fetchHandler: {
(paginator: Paginator, page: Int, pageSize: Int) in
// implement how to fetch results, must call paginator.receivedResults(_:total:) or paginator.failed()
if page < source.count {
paginator.receivedResults(source[page], total: 4)
} else {
paginator.failed()
}
}, resultsHandler: { (paginator, results) in
// Handle results
print(results) // results for the given page
print(paginator.results) // all results
}, resetHandler: { (paginator) in
// callback for a reset, Optional
tableView.reloadData()
}, failureHandler: { (paginator) in
// callback for a failure, Optional
self.presentFailureAlert()
})
声明属性
class ViewController: UIViewController {
var stringPaginator: Paginator<String>?
...
确保在 viewDidLoad()
中调用 fetchFirstPage()
,在需要加载更多结果的地方(例如,滚动到滚动视图的底部或点击按钮)使用 fetchNextPage()
override func viewDidLoad() {
super.viewDidLoad()
stringPaginator = ...
stringPaginator.fetchFirstPage()
}
func loadMoreResults() {
stringPaginator.fetchNextPage()
}
使用 fetchFirstPage()
或 fetchNextPage()
来调用获取操作。 fetchFirstPage()
会调用 reset()
,然后 fetchNextPage()
内部调用。
stringPaginator.fetchNextPage() // Use this one for most cases
stringPaginator.fetchFirstPage() // will reset paginator
以下将详细介绍如何在 fetchHandler
中定义获取行为 注意: Paginator
不允许同时请求。当 paginator.requestStatus
为 .InProgress
时,进入的请求将被忽略。
要重置分页器并清除所有存储结果,只需要调用
stringPaginator.reset()
以下关于 resetHandler
的详细信息说明了如何对 reset() 做出响应
requestStatus
属性存储一个类型为 RequestStatus
的枚举,包含 3 个状态,分别为 .Done
、.InProgress
和 .None
。在获取第 1 页之前,状态为 .None
,获取后变为 .InProgress
(此时正在处理异步请求),否则为 .Done
。
所有块都有一个 paginator: Paginator<T>
参数,这是分页器内部的 self
的引用,您可以在块中使用它,而无需考虑作用域问题。初始化方法中传递的所有块在初始化后都可以访问和更改,例如。
paginator.fetchHandler = ...
paginator.resultsHandler = ...
paginator.resetHandler = ...
paginator.failureHandler = ...
fetchHandler
块定义了获取新页面的行为。它从内部由 fetchNextPage()
调用。 注意:您必须在 fetchHandler
中调用 paginator.receivedResults(_:total:)
或 paginator.failed()
。
paginator.fetchHandler = {
(paginator, page, pageSize) in
APIClient.getResources() { (response, failure) in
if failure {
paginator.failed()
} else {
paginator.receivedResults(response.results, total: response.total)
}
}
}
resultsHandler
允许您处理正在进入的新结果批次。尽管它需要被定义,但它可以是空的,即
...
resultsHandler: { (_, _) in },
...
但通常用于通知视图控制器更新 UI。
...
resultsHandler: { (paginator, results) in
self.handleNewResults(results)
self.tableView.reloadData()
},
...
注意:传递给 resultsHandler
的 results
是针对该特定 页面 的结果,要访问所有结果,请使用 paginator.results
。
resetHandler
允许您执行诸如更新 UI 或其他必须在数据源更改后执行的活动等活动。这是可选的。
paginator.resetHandler = {
(paginator) in
self.tableView.reloadData()
}
failureHandler
允许您独立于 fetchHandler
对失败做出反应。这不是必需的,但是一种将获取逻辑与失败反应逻辑分离的好方法。
paginator.resetHandler = {
(paginator) in
self.presentFailedAlert()
}