gpt4 book ai didi

iOS 使用 ReactorKit 和 RxSwift 实现分页

转载 作者:行者123 更新时间:2023-11-28 14:11:10 25 4
gpt4 key购买 nike

我正在处理一个需要分页的 iOS 项目(API 调用将有一个 page 参数来提取结果)。理想情况是,当用户滚动到 collectionView 底部附近时,将调用 API 以获取更多结果(增加 page 编号),然后将新结果添加到现有模型数组中.

这是我在用户搜索时起作用的实现:

这是 PhotoListViewReactor

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
}

}

从API获取数据的函数是

static func request(keyword: String, page: Int) -> Observable<[Photo]>

我添加了一个 page: IntState 结构,但不知道如何实现 page (增加页面并调用 API 时用户滚动到底部)

最佳答案

这是我用 RxSwift 编写的解决方案。要点附带代码和单元测试。 https://gist.github.com/danielt1263/10bc5eb821c752ad45f281c6f4e3034b

它处理以下内容:

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
}

这是我不久前写的,我想我现在可以做得更好,但它应该可以帮助您入门。

关于iOS 使用 ReactorKit 和 RxSwift 实现分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52510219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com