
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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)