rxswift绑定视图模型数据以查看控制器UIImageView



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

var capturedImageData: Data?

我需要在capturedimagedata接收到数据之后取消unide uiimageView视图并设置映像,例如从相机捕获图像上。

您需要观察capturedImageData

的值

您可以创建capturedImageDatabehaviorRelay

之类的东西
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)

这种东西。

尚未测试代码,但是您可以遵循此方法。希望这有帮助

从您的代码中,我模拟了一个非常简单的示例。

ViewModel层中,您可以尝试保持输入/输出结构以使其易于重复使用和消费。在这里,输入将是您来自何处的Data,而输出UIImage?。简而言之,ViewModel执行逻辑来转换数据,仅在可用时才加载视图。

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

最新更新