RxPaginationFeedback
一个通用的RxSwift运算符,用于轻松地与分页API交互。基于RxFeedback。
设计
public typealias PageProvider<PageDependency, Element> = (PageDependency) -> Observable<Page<PageDependency, Element>>
public static func paginationSystem<PageDependency: Equatable, Element>(
scheduler: ImmediateSchedulerType,
initialDependency: PageDependency,
loadNext: Observable<Void>,
pageProvider: @escaping PageProvider<PageDependency, Element>
) -> Observable<PaginationState<PageDependency, Element>>
特性
- 简单的状态机用于表示分页使用案例。
- 可复用的分页逻辑。无需在不同屏幕之间复制分页API的状态。
- 观察状态以对加载事件、最新错误和元素列表的变化做出反应。
例子
Reqres例子
简单的struct ReqresResponse: Decodable {
let data: [User]
}
struct User: Decodable {
let firstName: String
let lastName: String
}
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let state = Driver.paginationSystem(
initialDependency: 0,
loadNext: loadNext
) { page -> Observable<PageResponse<Int, User>> in
let urlRequest = URLRequest(url: URL(string: "https://reqres.in/api/users?page=\(page)")!)
return URLSession.shared.rx.data(request: urlRequest)
.compactMap {
(try? decoder.decode(ReqresResponse.self, from: $0).data)
.map {
Page(nextDependency: page + 1, elements: $0)
}
}
}
state.map { $0.elements }
.drive(tableView.rx.items(cellIdentifier: "Cell", cellType: UITableViewCell.self)) { index, item, cell in
cell.textLabel?.text = "\(item.firstName) - \(item.lastName)"
}
.disposed(by: disposeBag)