草庐IT

swift - RxSwift 分页

coder 2023-09-06 原文

我无法设法让这个解决方案起作用: https://github.com/liuznsn/RxMoyaPaginationNetworking

也许有人可以告诉我哪里错了。 loading 变量永远不会变为 false。我猜问题出在可观察到的请求中,但我找不到原因。

class PaginationNetworkModel<T1: Mappable>: NSObject {

let refreshTrigger = PublishSubject<Void>()
let loadNextPageTrigger = PublishSubject<Void>()
let loading = Variable<Bool>(false)
let elements = Variable<[T1]>([])
var offset:Int = 0
let error = PublishSubject<Swift.Error>()

private let disposeBag = DisposeBag()

override init() {
    super.init()

    let refreshRequest = loading.asObservable()
        .sample(refreshTrigger)
        .flatMap { [unowned self] loading -> Observable<[T1]> in
            if loading {
                return Observable.empty()
            } else {
                return self.loadData(offset: self.offset)
            }
    }

    let nextPageRequest = loading.asObservable()
        .sample(loadNextPageTrigger)
        .flatMap { [unowned self] loading -> Observable<[T1]> in
            if loading {
                return Observable.empty()
            } else {
                self.offset += 1
                return self.loadData(offset: self.offset)
            }
    }

    let request = Observable
        .of(refreshRequest, nextPageRequest)
        .merge()
        .shareReplay(1)

    let response = request.flatMap { events -> Observable<[T1]> in
        request
            .do(onError: { error in
                self.error.onNext(error)
            }).catchError({ error -> Observable<[T1]> in
                Observable.empty()
            })
    }.shareReplay(1)

    Observable
        .combineLatest(request, response, elements.asObservable()) { [unowned self] request, response, elements in
            return self.offset == 0 ? response : elements + response
        }
        .sample(response)
        .bind(to: elements)
        .addDisposableTo(rx_disposeBag)

    Observable
        .of(request.map { _ in true },
            response.map { $0.count == 0 },
            error.map { _ in false }
        )
        .merge()
        .bind(to: loading)
        .addDisposableTo(rx_disposeBag)
}

func loadData(offset: Int) -> Observable<[T1]> {
    return Observable.empty()
}

最佳答案

感谢大牛的帮助,这里完成了解决方案

调用示例:

goodsModel = GoodsNetworkModel()
    goodsModel.elements.asObservable().bind(to: tableView.rx.items(cellIdentifier: "Cell", cellType: StoreCell.self)) { (ip, item: Goods, cell: StoreCell) in
        cell.configure(goods: item)
    }.addDisposableTo(rx_disposeBag)

    tableView.rx.itemSelected.bind() { [unowned self] ip in
        self.didSelectRow(ip: ip.row)
    }.addDisposableTo(rx_disposeBag)

    rx.sentMessage(#selector(UIViewController.viewDidAppear(_:)))
        .map { _ in () }
        .bind(to: goodsModel.refreshTrigger)
        .addDisposableTo(rx_disposeBag)

    tableView.rx_reachedBottom
        .map{ _ in ()}
        .bind(to: goodsModel.loadNextPageTrigger)
        .addDisposableTo(rx_disposeBag)

模型代码:

class PaginationNetworkModel<T1: Mappable>: NSObject {

let refreshTrigger = PublishSubject<Void>()
let loadNextPageTrigger = PublishSubject<Void>()
let loading = Variable<Bool>(false)
let elements = Variable<[T1]>([])
var offset:Int = 0
let error = PublishSubject<Swift.Error>()

private let disposeBag = DisposeBag()

override init() {
    super.init()

    let refreshRequest = loading.asObservable()
        .sample(refreshTrigger)
        .flatMap { loading -> Observable<Int> in
            if loading {
                return Observable.empty()
            } else {
                return Observable<Int>.create { observer in
                    observer.onNext(0)
                    observer.onCompleted()
                    return Disposables.create()
                }
            }
    }

    let nextPageRequest = loading.asObservable()
        .sample(loadNextPageTrigger)
        .flatMap { [unowned self] loading -> Observable<Int> in
            if loading {
                return Observable.empty()
            } else {
                return Observable<Int>.create { [unowned self] observer in
                    self.offset += 1
                    observer.onNext(self.offset)
                    observer.onCompleted()
                    return Disposables.create()
                }
            }
    }

    let request = Observable
        .of(refreshRequest, nextPageRequest)
        .merge()
        .shareReplay(1)

    let response = request.flatMap { offset -> Observable<[T1]> in
        self.loadData(offset: offset)
            .do(onError: { [weak self] error in
                self?.error.onNext(error)
            }).catchError({ error -> Observable<[T1]> in
                Observable.empty()
            })
        }.shareReplay(1)

    Observable
        .combineLatest(request, response, elements.asObservable()) { [unowned self] request, response, elements in
            return self.offset == 0 ? response : elements + response
        }
        .sample(response)
        .bind(to: elements)
        .addDisposableTo(rx_disposeBag)

    Observable
        .of(request.map{_ in true},
            response.map { $0.count == 0 },
            error.map { _ in false })
        .merge()
        .bind(to: loading)
        .addDisposableTo(rx_disposeBag)
}

func loadData(offset: Int) -> Observable<[T1]> {
    return Observable.empty()
}

关于swift - RxSwift 分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43423597/

有关swift - RxSwift 分页的更多相关文章

  1. ruby - 每个页面上的 Jekyll 分页 - 2

    据我们所知,Jekyll默认分页仅支持index.html,我想创建blog.html并在那里包含分页。有什么解决办法吗? 最佳答案 如果您创建一个名为/blog的目录并在其中放置一个index.html文件,那么您可以向_config.yml表示paginate_path:"blog/page:num"。不是使用根文件夹中的默认index.html作为分页器模板,而是使用/blog/index.html。分页器将根据需要生成类似/blog/page2/和/blog/page3/的页面。这将使您到达yourwebsite.com/b

  2. ruby - 使用 Her、Faraday 在 API 中进行 Rails 分页 - 2

    我一整天都在想办法解决这个问题,这让我发疯了。我有两个Rails应用程序,ServerApp和ClientApp。ClientApp使用Hergem通过API从ServerApp获取数据。一切都很好,直到我需要分页信息。这是我用来获取订单的方法(使用kamainari进行分页,使用ransack进行搜索):#ServerAppdefsearch@search=Order.includes(:documents,:client).order('iddesc').search(params[:q])@orders=@search.result(distinct:true).page(par

  3. Ruby SSH 禁用分页 - 2

    有什么方法可以禁用或设置ruby​​Net-SSH连接的页面长度,这样我们就不必更改远程设备上的设置了吗?在Cisco路由器中,我们将使用参数“terminallength0”来完成此操作,但在其他服务器上,我们不能使用任何类似的命令。这可以通过Net-SSHlib设置吗? 最佳答案 假设远程端有一个shell,那么终端高度在LINES环境变量中设置。您可以尝试这样设置:Net::SSH.start('hostname','user')do|ssh|ssh.exec!('LINES=50your-command-here')end如

  4. ruby - 不需要的表单参数被附加到分页链接 - 2

    我有一个页面,用于通过使用提供的表格提交数据来搜索列表。表单参数通过ajax(post请求)提交,在搜索表中创建一条新记录,然后通过show显示列表(动态地,在提交表单的同一页面上)此记录的操作。结果有kaminari提供的分页链接,如下所示:{:controller=>'searches',#Ihavetospecifytheidbecausemysearchesarestoredinthedatabase:action=>'show',:id=>search.id},:remote=>true%>请注意,分页链接是动态包含在页面中的。因此,当我进行新搜索并获得新列表时,服务器会重新

  5. Elasticsearch7.8.0版本入门—— 分页查询文档(高级查询) - 2

    目录一、初始化文档数据二、分页查询文档2.1、概述2.2、示例一、初始化文档数据在Postman中,向ES服务器发POST请求:http://localhost:9200/user/_doc/1,请求体内容为:{"name":"zhangsan","age":20,"sex":"男"}在Postman中,向ES服务器发POST请求:http://localhost:9200/user/_doc/2,请求体内容为:{"name":"zhangsan1","age":21,"sex":"男"}在Postman中,向ES服务器发POST请求:http://localhost:9200/user/_d

  6. ruby-on-rails - 在 Kaminari 中对多个模型进行分页 - 2

    我正在创建一个搜索页面,该页面将对用户、帖子和评论进行应用程序范围内的搜索。我目前有:#POST/searchdefindexquery=params[:query]@users=User.search(query).page(params[:page])@posts=Post.search(query).page(params[:page])@comments=Comment.search(query).page(params[:page])respond_todo|format|format.htmlendend不过,我真的想把所有结果混合在一起然后分页。像这样进行分页搜索有哪些策

  7. ruby-on-rails - Kaminari & Rails 分页 - 未定义的方法 `current_page' - 2

    我搜索了又搜索,但没有解决我的问题。这是我的Controller:defshow@topic=Topic.find(params[:id])@topic.posts=@topic.posts.page(params[:page]).per(2)#2fordebuggingend这很好用,因为主题View被缩减为两个帖子。但是,当我将其添加到show.html.erb时:我收到这个错误:undefinedmethod`current_page'for# 最佳答案 尝试:defshow@topic=Topic.find(params[:

  8. ruby-on-rails - 使用 will_paginate 在 Ruby 中对数组进行分页 - 2

    我有一个数组@level1,看起来像这样:[[3.0,4,2],[2.0,48,3],[2.1,56,4],............]我想在这个数组上应用分页,这样每个页面一次只显示几行。我试过这个:@temp1=@level1.paginate(:page=>params[:page])但它抛出以下错误:undefinedmethod`paginate'for[[3.0,4,2],[2.0,48,3],[2.1,56,4]]:Array如何使用will_paginate对此执行分页? 最佳答案 参见https://github.c

  9. 开发者工具network里请求pending状态耗时长是为什么?(项目部分页面的请求) - 2

    前言:本文主要是提问,后文有一个解决办法,但仅供参考目录问题排查过程解决办法(仅供参考)提问:问题        在开发一个数字化大屏项目的时候遇到问题:某个大屏接口请求10多秒才能拿到响应数据,其他大屏页面接口响应很快。排查过程    发现主要是接口status状态为pending的时间很长(如下图)        进一步发现是”排队等待“时间长(如下图),网上搜索了以上pending状态和和排队时间的解释,也不是很明白。queueing优化_从Timing看HTTP请求的优化方向_weixin_39933082的博客-CSDN博客1,背景在Chrome开发者工具中,有一个Timing菜单,

  10. javascript - 一起使用 Jquery 分页和历史插件的最有效方式 - 2

    在我的ASP.NETMVC3应用程序中,我想使用Jquery的pagination插件来制作我的论坛...所以我想用Ajax完成所有页面更改,并想使用history插件来处理浏览器的后退和下一步按钮...最有效的javascript/jquery代码是什么?我一个月前写了这段代码,但现在看来我很丑..检查一下$(document).ready(function(){$.history.init(function(hash){if(hash!=""){NavigateToPage(hash.substring(0,hash.indexOf("page")),hash.substring(

随机推荐