如何检查 RXSwift 中的 observable 是不是为空?

Posted

技术标签:

【中文标题】如何检查 RXSwift 中的 observable 是不是为空?【英文标题】:How to check if an observable is empty in RXSwift?如何检查 RXSwift 中的 observable 是否为空? 【发布时间】:2019-09-18 11:35:22 【问题描述】:

我已经像这样初始化了一个空的 observable:

var subCategories = Observable<[String]>.empty()

如何检查 observable 是否为空?如果可观察对象为空,我想向用户显示“空视图”,否则在 tableview 中显示数据。

【问题讨论】:

Empty Observable 指的是 Observable 发出单个 onComplete。你描述的用例应该用一个 Observable 来实现,它发出 [String] 长度从 0 到 n。 【参考方案1】:

创建一个 bool Observable 来显示/隐藏您的 emptyView:

let hideEmptyView = subCategories.map!$0.isEmpty

然后将此hideEmptyView Bool Observable 绑定到yourEmptyView.rx.isHidden

【讨论】:

【参考方案2】:

你必须在 Observable 上使用过滤器:

viewModel.filteredUsers.asObservable()
        .filter( [weak self] array in
            guard let self = self else return true
            
            if array.isEmpty 
                self.emptyListContainer.alpha = 1
                self.tableView.alpha = 0
             else 
                self.emptyListContainer.alpha = 0
                self.tableView.alpha = 1
                
            
            return true
        )
        .bind(to: tableView.rx.items(cellIdentifier: "ContactsTableViewCell", cellType: ContactsTableViewCell.self))  (row, user, cell) in
        cell.titleLbl.text = user.name
    
    .disposed(by: disposeBag)

【讨论】:

【参考方案3】:

使用 BehaviourRelay 而非 Observable

import RxCocoa
import RxSwift

var subCategories = BehaviorRelay<[String]>(value: [])
let emptyView = UIStackView()

func addObservers() 
    subCategories.asObservable().subscribe  _ in
        self.emptyView.isHidden = !self.subCategories.value.isEmpty
    .disposed(by: DisposeBag())

【讨论】:

以上是关于如何检查 RXSwift 中的 observable 是不是为空?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 RXSwift 中的 observable 是不是为空?

使用 RXSwift 的警报消息的 UIViewController 扩展

压缩后 RxSwift 丢失订单

如何使用 RxSwift 和 Alamofire 使用分页?

RXSwift 平面地图

如何使用 RxSwift 观察 UITextField 中的文本变化?