【问题标题】:Getting string from ViewModel to View in RxSwift在 RxSwift 中从 ViewModel 获取字符串到 View
【发布时间】:2018-02-11 10:44:38
【问题描述】:

我正在尝试使用PublishSubject() 获取从ViewModelView 的字符串,但View 无法获取。以下是我在ViewModel 中的代码:

var myImageURL: PublishSubject<String> = PublishSubject<String>()

self.myService.getImage(materialNo: materialNumber).subscribe(
    onNext: { [weak self] imageURL in //I am able to get url here and want to send it to View, following doesn't work
        self?.myImageURL.onNext(imageURL)
        self?.myImageURL.onCompleted()
    },
    onError: { error in },
    onCompleted: { }
)
.disposed(by: disposeBag)

View中的代码:

let disposeBag = DisposeBag()

self.viewModel.myImageURL.subscribe(
    onNext: { 
        print($0 + " image url")
        self.myImageView.af_setImage(withURL: URL(string: $0)!, placeholderImage:UIImage(named: "tool_placeholder"))
    },
    onError: {
        print(String(describing: $0).capitalized)
    }
)
.disposed(by: disposeBag)

虽然 viewModel 代码工作正常,但我无法在 View 中接收到它的值。

编辑1: 更新了驱动视图中的代码:

self.viewModel.myImageURL
        .asObservable()
        .asDriver(onErrorJustReturn: "Error")
        .drive(onNext: {
                        self. myImageView.af_setImage(withURL: URL(string: $0)!, placeholderImage:UIImage(named: "tool_placeholder"))
                    }
            )
        .disposed(by: disposeBag)

【问题讨论】:

  • viewModel.myImageURL 可能会在视图订阅它之前发出一个值。没有更多的上下文很难说。您可以尝试在视图模型的onNext 块中放置一个断点,在视图中对subscribe 的调用中放置另一个断点,并检查它们是否按预期顺序发生。 HTH。

标签: ios swift mvvm rx-swift


【解决方案1】:

看起来您订阅的值不正确?你定义了:

var toolImageURL: PublishSubject<String> = PublishSubject<String>()

在您的 viewModel 中,但在 viewModel.myImageURL 上调用了 subscribe

【讨论】:

  • 我在代码里改了名字,但是在声明时忘记改了
  • @pankaj,嗨。可以分享一下项目吗?
  • 不,我不能,因为它属于我的办公室
【解决方案2】:

您正在使用的发布主题应使用“驱动程序”“绑定”到 ImageView,以确保其代码在主线程上运行(否则可能会崩溃)。

self.viewModel.myImageURL
  .asObservable()
  .asDriver(onErrorJustReturn: "Error")
  .drive(self.myImageView.af_setImage(withURL: URL(string: $0)!,
                               placeholderImage:UIImage(named: "tool_placeholder")))
  .addDisposableTo(self.disposeBag)

先试试。 其次,您在 VM 中的代码在我看来并不那么直接,您为什么在 onNext 块中调用 onCompleted?为什么不直接使用onCompleted 阻止您在底部留空广告?

self.myService.getImage(materialNo: materialNumber).subscribe(
    onNext: { [weak self] imageURL in //I am able to get url here and want to send it to View, following doesn't work
        self?.myImageURL.onNext(imageURL)
        self?.myImageURL.onCompleted()
    },
    onError: { error in },
    onCompleted: { }
)
.disposed(by: disposeBag)

【讨论】:

  • 感谢回复,如何在驱动器中获取图片网址?你有这样的例子吗?
  • 我已经使用了你的代码,但我仍然无法从我的 viewModel 进入这个驱动块
猜你喜欢
  • 1970-01-01
  • 2018-07-22
  • 2021-10-13
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
相关资源
最近更新 更多