Ios RxSwift simple with latest from not firing
我有一个可观察的Ios RxSwift simple with latest from not firing,ios,swift,rx-swift,reactivex,rx-cocoa,Ios,Swift,Rx Swift,Reactivex,Rx Cocoa,我有一个可观察的 lazy var user = _user.share(replay: 1) private let _user = PublishRelay<User>() 除非此事件从不激发(不要进入闭包),因为user在订阅之前已激发 在viewDidLoad事件中,我从我的可观察对象中获取最新的用户值,我如何实现这种行为 编辑: 在我的singleton init中,如果我加入一个随机的user.subscribe()…,那么这一切都可以正常工作。我很困惑…我明白了问题所
lazy var user = _user.share(replay: 1)
private let _user = PublishRelay<User>()
除非此事件从不激发(不要进入闭包),因为user
在订阅之前已激发
在viewDidLoad
事件中,我从我的可观察对象中获取最新的用户
值,我如何实现这种行为
编辑:
在我的singleton init中,如果我加入一个随机的
user.subscribe()…
,那么这一切都可以正常工作。我很困惑…我明白了问题所在。PublishRelay基本上只是一个PublishSubject
在viewModel订阅之前推到它上的任何内容都将丢失。.share(replay:1)可能会有所帮助,但在用户被推上它之前需要订阅一些内容,以便它“捕获”事件并缓存值以供以后的订阅者使用
即使这样,您也可能需要.share(重播:1,作用域:。永远)
您需要记住,您可以设置您想要的所有可观察链,但在某个对象最终订阅该链之前,该链中的任何操作都不会执行
将用户状态更改为BehaviorSubject(值:nil)。这将捕获并保留当前用户,即使没有任何用户订阅
然后在视图模型上执行以下操作
class ProfileViewModel {
lazy var user = UserState.shared.user.compactMap { $0 }
lazy var name = user.map { $0.username }
lazy var age = user.map { "\($0.age) years old" }
.do(onNext: { print($0) }
// etc
}
class profileViewController {
...
override func viewDidLoad() {
...
profileViewModel.name
.subscribe(onNext: { [weak self] name in
self?.title = name
}
.disposed(by: disposeBag)
}
}
请注意,如果用户(以及用户名)可以在显示此视图控制器期间动态更改,并且希望标题自动更新,则需要此选项
还请注意,如图所示,您永远不会在.do语句中看到用户的年龄,因为当前没有任何内容订阅或绑定到该可观察子链。您是否订阅由
返回的可观察内容,并使用最新的from
?更新答案以解释编辑代码中提供的新线索。看下面:嗯,我尝试了share(replay:1)
路线,但似乎仍然没有触发我的流。我编辑了我的帖子,我的VC在viewdiload()上调用了这个viewModel方法@Brejuro知道了发生了什么。见修改后的,修改后的答案。
class ProfileViewModel {
lazy var user = UserState.shared.user.compactMap { $0 }
lazy var name = user.map { $0.username }
lazy var age = user.map { "\($0.age) years old" }
.do(onNext: { print($0) }
// etc
}
class profileViewController {
...
override func viewDidLoad() {
...
profileViewModel.name
.subscribe(onNext: { [weak self] name in
self?.title = name
}
.disposed(by: disposeBag)
}
}