未调用 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-Function 引发错误吗