RxPaginationFeedback 1.3.0

RxPaginationFeedback 1.3.0

Fabio Felici维护。



  • 作者:
  • Fabio Felici

RxPaginationFeedback

pod Swift Package Manager compatible Build Status codecov

一个通用的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)

更多例子