Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS使用ReactorKit和RxSwift实现分页_Ios_Swift_Pagination_Rx Swift - Fatal编程技术网

iOS使用ReactorKit和RxSwift实现分页

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

我正在处理一个需要分页的iOS项目(API调用将有一个
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链接不存在。你能更新链接吗?