Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios RxSwift simple with latest from not firing_Ios_Swift_Rx Swift_Reactivex_Rx Cocoa - Fatal编程技术网

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)
  }
}