ios – 使用RxSwift刷新后绑定到UIRefreshControl

ios – 使用RxSwift刷新后绑定到UIRefreshControl,第1张

概述我有一个TableView的通知.我想刷新使用UIRefreshControl进行刷新.如何用rx- swift做到这一点?这是我的代码.为我将值设置为变量数据后,为什么tableView没有刷新 var refreshControl = UIRefreshControl()var disposeBag = DisposeBag()let loadingData = ActivityIndi 我有一个tableVIEw的通知.我想刷新使用UIRefreshControl进行刷新.如何用rx- swift做到这一点?这是我的代码.为我将值设置为变量数据后,为什么tableVIEw没有刷新

var refreshControl = UIRefreshControl()var disposeBag = disposeBag()let loadingData = ActivityIndicator()var data: Observable<[Notification]>!overrIDe func vIEwDIDLoad() {    super.vIEwDIDLoad()    self.vIEw = v    v.tableVIEw.registerClass(NotificationsVIEwCell.self,forCellReuseIDentifIEr: "Cell")    v.tableVIEw.addSubvIEw(refreshControl)    data = getNotifications()    configuretableDataSource()    configureActivityIndicatoRSShow()    refreshControl.rx_controlEvent(.ValueChanged)        .flatMapLatest{ [uNowned self] _ in            return self.getNotifications()            .trackActivity(self.loadingData)        }.subscribe(            onNext: {notification in                print("success")                self.data = Observable.just(notification) // NOT REFRESH tableVIEW            },onError: { error in                print("Error \(error)")            },onCompleted: {() in                print("complete")            },ondisposed: {() in                print("disposed")            })        .adddisposableto(disposeBag)}func configuretableDataSource(){    data        .retry(3)        .doOnError{ [weak self] error in            self?.v.emptyLabel.hIDden = false            self?.v.retrybutton.hIDden = false        }        .doOnNext{ [weak self] result in            if result.count == 0 {                self?.v.emptyLabel.hIDden = false                self?.v.emptyLabel.text = "TIDak ada bisnis favorit"            } else {                self?.v.emptyLabel.hIDden = true                self?.v.retrybutton.hIDden = true            }        }        .trackActivity(loadingData)        .retrywhen{ _ in            self.v.retrybutton.rx_tap        }        .asDriver(onErrorJustReturn: [])        .map{ results in            results.map(Notificationsviewmodel.init)        }        .drive(v.tableVIEw.rx_itemsWithCellIDentifIEr("Cell",cellType: NotificationsVIEwCell.self)) { (index,viewmodel,cell) in            cell.viewmodel = viewmodel            let tap = UITapGestureRecognizer(target: self,action: #selector(self.gotoprofile(_:)))            tap.numberOfTapsrequired = 1            cell.photo.tag = index            cell.photo.addGestureRecognizer(tap)        }        .adddisposableto(disposeBag)}func configureActivityIndicatoRSShow(){    loadingData        .driveNext{ isLoading in            if !isLoading {                self.v.indicatorVIEw.stopAnimating()            } else {                self.v.indicatorVIEw.startAnimating()                self.v.retrybutton.hIDden = true                self.v.emptyLabel.hIDden = true            }        }        .adddisposableto(disposeBag)    loadingData.asObservable()        .bindTo(refreshControl.rx_refreshing)        .adddisposableto(disposeBag)}func getNotifications() -> Observable<[Notification]> {    let parameters = [        "token": NSUserDefaults.standardUserDefaults().objectForKey("token")! as! String    ]    return string(.POST,NOTIFICATION_List,parameters: parameters)        .map { Json in            return Notification.parseJsON(JsON.parse(Json)["notifications"])        }        .observeOn(MainScheduler.instance)}

编辑::

var data = Variable<[Notification]>([])overrIDe func vIEwDIDLoad() {    getNotifications()        .retry(3)        .doOnError{ [weak self] error in            self?.v.emptyLabel.hIDden = false            self?.v.retrybutton.hIDden = false        }        .doOnNext{ [weak self] result in            if result.count == 0 {                self?.v.emptyLabel.hIDden = false                self?.v.emptyLabel.text = "TIDak ada notifikasi"            } else {                self?.v.emptyLabel.hIDden = true                self?.v.retrybutton.hIDden = true            }        }        .trackActivity(loadingData)        .retrywhen{ _ in            self.v.retrybutton.rx_tap        }        .bindTo(data)        .adddisposableto(disposeBag)    refreshControl.rx_controlEvent(.ValueChanged)        .flatMapLatest{ [uNowned self] _ in            return self.getNotifications()                .doOnError{ [weak self] error in                     // This not call after the second pull to refresh if No network connection,so refresh control still appear                    self?.refreshControl.endRefreshing()                  }                .doOnCompleted{ [weak self] result in                    self?.refreshControl.endRefreshing()                }        }.bindTo(data)        .adddisposableto(disposeBag)}func configuretableDataSource(){    datas.asObservable()        .asDriver(onErrorJustReturn: [])        .map{ results in            results.map(Notificationsviewmodel.init)        }        .drive(v.tableVIEw.rx_itemsWithCellIDentifIEr("Cell",cell) in            cell.viewmodel = viewmodel        }        .adddisposableto(disposeBag)}func configureActivityIndicatoRSShow(){    loadingData        .driveNext{ isLoading in            if !isLoading {                self.v.indicatorVIEw.stopAnimating()            } else {                self.v.indicatorVIEw.startAnimating()                self.v.retrybutton.hIDden = true                self.v.emptyLabel.hIDden = true            }        }        .adddisposableto(disposeBag)}
解决方法 self.data = Observable.just(notification)正在创建一个新的Observable并在该Observable上发送新的[Notification]元素,没有人订阅.

您应该使用诸如变量之类的主题.

// instead of `var data: Observable<[Notification]>!`let data = Variable<[Notification]>([])// and then later,when you want to send out a new element:self.data.value = notification

编辑:向您展示如何结合您已有的使用它.

// this will update `data` upon `refreshControl` value changerefreshControl.rx_controlEvent(.ValueChanged)    .flatMapLatest{ [uNowned self] _ in        return self.getNotifications()    }    .bindTo(data)    .adddisposableto(disposeBag)// this will update `loadingData` when `data` gets a new elementdata.asDriver().trackActivity(self.loadingData)// bind to your table vIEwdata.asDriver().drive(//.....

另外,考虑移动重试并重试更快发生,而不是发生在当前拥有它的下游(在表视图绑定中).相反,我认为它应该属于getNotifications.

总结

以上是内存溢出为你收集整理的ios – 使用RxSwift刷新后绑定到UIRefreshControl全部内容,希望文章能够帮你解决ios – 使用RxSwift刷新后绑定到UIRefreshControl所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1029762.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-23
下一篇2022-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存