未调用 Rxswift Map 和 Zip

Posted

技术标签:

【中文标题】未调用 Rxswift Map 和 Zip【英文标题】:Rxswift Map and Zip not Called 【发布时间】:2020-02-20 19:48:46 【问题描述】:

我正在尝试获取异步生成的 2 个 observables 的元素,并在收到两者后将它们作为参数传递给函数。

但是,我在下面的 ViewModel 中的地图运算符没有执行,断点只是跳过它。

ViewModel.swift

init(api: ApiService) 
        self.api = api
    

func getData1() -> Observable<Data1> 
        return api.getData1()
    

    func getData2()  -> Observable<NewViewModel> 
        return Observable.create  observer in

            let disposable = Disposables.create()
            self.api.getData2()
            .map 
                $0.arrayOfStuff.forEach  (stuff) in
                    let background = stuff.background

                let newViewModel = NewViewModel( background: self.spotlightBackground)
                observor.onNext(newViewModel)
                
            return disposable
            
        

在我的 ViewController 中,我正在创建 observables 的 Zip,因为 newViewModel[getData2] 可能会稍后返回,并且我想在两个 observables 都发出值时调用该函数

在我的 viewDidLoad() 中,我通过订阅和添加 observables 来设置 zip

let zippy = Observable.zip(viewModel.getData1(), viewModel.getData2()).subscribe(onNext:  (data1, newViewModel) in
            self.layoutSetUp(data1: data1, newViewModel: newViewModel)
            )
        zippy.disposed(by: disposeBag)

private func layoutSetUp(data1: Data1, newViewModel: NewViewModel) 


        DispatchQueue.main.async 
                self.view = SwiftUIHostingView(rootView: SwiftUIContentView(data1: data1, newViewModel: newViewModel))
        
    

这没有执行,也没有任何值传递给函数,我不知道为什么

【问题讨论】:

【参考方案1】:

您的getData2 方法永远不会发出值,因此 zip 也不会。该方法中的代码有点混乱,我无法理解您要做什么,所以我无法准确告诉您您需要什么,但我可以说,当您有一个可观察的没有订阅任何内容,则它不会发出值。

这一点:

self.api.getData2()
    .map 
        $0.arrayOfStuff.forEach  (stuff) in
            let background = stuff.background

            let newViewModel = NewViewModel(background: self.spotlightBackground)
            observor.onNext(newViewModel)
        
        return disposable
    

是一个没有订阅者的 observable。

【讨论】:

以上是关于未调用 Rxswift Map 和 Zip的主要内容,如果未能解决你的问题,请参考以下文章

rxswift-self.usernameTF.rx.text.orEmpty.map

RxSwift - 当 UITextField 以编程方式更新时,UILabel 字段未更新

RxSwift之深入解析map操作符的底层实现

我可以从 rxSwift map-Function 引发错误吗

6. RxSwift 订阅操作过滤1 mapbufferfilter

未生成 RxSwift 委托绑定?