iOS使用ReactorKit和RxSwift实现分页
我正在处理一个需要分页的iOS项目(API调用将有一个iOS使用ReactorKit和RxSwift实现分页,ios,swift,pagination,rx-swift,Ios,Swift,Pagination,Rx Swift,我正在处理一个需要分页的iOS项目(API调用将有一个page参数来获取结果)。理想情况是,当用户在collectionView底部附近滚动时,调用API会获取更多结果(增加pagenumber),然后将新结果添加到现有模型数组中 以下是我在用户搜索时使用的实现: 这是照片列表 import RxSwift import RxCocoa import ReactorKit class PhotoListViewReactor : Reactor { enum Action { c
page
参数来获取结果)。理想情况是,当用户在collectionView
底部附近滚动时,调用API会获取更多结果(增加page
number),然后将新结果添加到现有模型数组中
以下是我在用户搜索时使用的实现:
这是照片列表
import RxSwift
import RxCocoa
import ReactorKit
class PhotoListViewReactor : Reactor {
enum Action {
case searchFlickr(_ keyword: String, _ page: Int)
}
enum Mutation {
case flickrList([Photos])
}
struct State{
var keyword : String?
var photos : [Photos] = []
var page: Int = 1
}
var initialState: State = State()
init() { }
func mutate(action: Action) -> Observable<Mutation> {
switch action {
case let .searchFlickr(keyword,page):
return AppService.request(keyword: keyword,page: page)
.catchErrorJustReturn([])
.map{[Photos(photos: $0)]}
.map {Mutation.flickrList($0)}
}
}
func reduce(state: State, mutation: Mutation) -> State {
var newState = state
switch mutation {
case let .flickrList(photos):
newState.photos += photos
newState.page += 1
}
return newState
}
}
导入RxSwift
进口RxCocoa
进口反应器
类别:反应器{
枚举操作{
case searchFlickr(u关键字:String,u页面:Int)
}
枚举突变{
案例flickrList([照片])
}
结构状态{
var关键字:字符串?
var照片:[照片]=[]
变量页:Int=1
}
var initialState:State=State()
init(){}
func mutate(action:action)->可观察{
开关动作{
case let.searchFlickr(关键字,页面):
返回AppService.request(关键字:关键字,页面:页面)
.catchErrorJustReturn([])
.map{[照片(照片:$0)]}
.map{Mutation.flickrist($0)}
}
}
func reduce(state:state,mutation:mutation)->state{
var newState=状态
开关突变{
case let.flickrList(照片):
newState.photos+=照片
newState.page+=1
}
返回新闻状态
}
}
用于从API获取数据的函数是
static func request(keyword: String, page: Int) -> Observable<[Photo]>
static func请求(关键字:String,page:Int)->可观察
我添加了一个页面:
Int
到State
struct,但不知道如何实现page
(当用户滚动到底部时增加页面并调用API)下面是我用RxSwift编写的一个解决方案。代码和单元测试都提供了要点
它处理以下事项:
protocol PaginationUISource {
var reloadLastPage: Observable<Void> { get } /// reload most recently loaded page
var loadNextPage: Observable<Void> { get } /// load next page
var bag: DisposeBag { get }
}
protocol PaginationNetworkSource {
associatedtype Item
func loadData(page: Int) -> Observable<[Item]>
}
struct PaginationSink<T> {
let isLoading: Observable<Bool> /// true if network loading is in progress.
let elements: Observable<[T]> /// elements from all loaded pages
let error: Observable<Error> /// fires once for each error
}
协议分页源{
var reloadLastPage:Observable{get}///重新加载最近加载的页面
var loadNextPage:Observable{get}///加载下一页
变量包:DisposeBag{get}
}
协议分页网络源{
关联类型项
func loadData(第页:Int)->可观察
}
结构分页链接{
如果正在进行网络加载,则让isLoading:Observable//true。
let elements:Observable///来自所有加载页面的元素
let error:Observable///为每个错误触发一次
}
这是我不久前写的,我想我现在可以做得更好,但它应该可以帮助您开始。谢谢。让我看看如何实现这一点。但尝试实施reactorKit方法。它的概念非常清晰,可以应用于更复杂的系统。我更新了Swift 4.2的要点,并对其进行了改进。@DanielT。gist链接不存在。你能更新链接吗?