RXSwift将视图模型数据绑定到视图控制器uiimageview

时间:2019-08-02 08:35:09

标签: ios swift iphone rx-swift

我是RXSwift的新手,请帮助找到最佳解决方案。 我有带有实例变量的视图模型:

var capturedImageData: Data?

例如,在从相机捕获的图像上,我需要取消隐藏UIImageView视图并设置图像。

2 个答案:

答案 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来确保它在主线程上运行。