簡體   English   中英

在ViewModel中將字符串從RxSwift中獲取到View

[英]Getting string from ViewModel to View in RxSwift

我正在嘗試使用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接收其值。

Edit1:在驅動器視圖中更新了代碼:

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)

看起來您訂閱的值不正確? 您定義了:

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

在您的viewModel中,但是在viewModel.myImageURL上稱為subscribe

您使用的發布主題應使用“驅動程序”“綁定”到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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM