我是RXSwift的新手,请帮助找到最佳解决方案。 我有带有实例变量的视图模型:
var capturedImageData: Data?
例如,在从相机捕获的图像上,我需要取消隐藏UIImageView视图并设置图像。
答案 0 :(得分:0)
您将需要观察capturedImageData
的值
您可以创建behaviorRelay
中的capturedImageData
类似
var capturedImageData:<Data?> = BehaviorRelay.init(value: nil)
在获取数据时,您添加了类似的操作
capturedImageData.accept(data)
在您的viewController中,您订阅capturedImageData
self.capturedImageData.asObservable().subscribe(onNext: { (data) in
self.imageView.image = UIImage.init(data: data)
self.imageView.isHidden = false
}).disposed(by: bag)
这种事情。
还没有测试代码,但是您可以遵循这种方法。 希望这会有所帮助
答案 1 :(得分:0)
从您的代码中,我模拟了一个非常简单的示例。
在您的ViewModel
层中,您可以尝试保留Input / Output结构以使其易于重用和使用。无论输入来自哪里,这里的输入都是您的Data
,输出UIImage?
就是输入。简而言之,ViewModel会执行逻辑转换数据,只有在可用时,View才会加载。
struct ViewModel {
// input
let loadingImageData: PublishRelay<Data>
// output
let showImage: Driver<UIImage?>
init() {
let dataRelay = PublishRelay<Data>()
self.loadingImageData = dataRelay
self.showImage = dataRelay.map({ UIImage(data: $0) }).asDriver(onErrorJustReturn: nil)
}
func loadimage() {
// your code here to load Data ...
loadingImageData.accept(imageData)
}
}
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
let viewModel = ViewModel()
let disposeBag = DisposeBag()
override func viewDidLoad() {
// bind output viewmodel to UIImageView
viewModel.showImage
.drive(imageView.rx.image)
.disposed(by: disposeBag)
}
}
您可以扩展逻辑以隐藏/显示元素,就像创建Bool事件一样。
struct ViewModel {
// ...
let isImageHidden: Driver<Bool>
init() {
let dataRelay = PublishRelay<Data>()
self.loadingImageData = dataRelay
self.showImage = dataRelay.map({ UIImage(data: $0) }).asDriver(onErrorJustReturn: nil)
self.isImageHidden = showImage.map({ $0 == nil })
}
}
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
let viewModel = ViewModel()
let disposeBag = DisposeBag()
override func viewDidLoad() {
// ...
viewModel.isImageHidden
.drive(imageView.rx.isHidden)
.disposed(by: disposeBag)
}
}
请注意,我使用Driver
来确保它在主线程上运行。