我是RXSWIFT的新手,请帮助找到最佳解决方案。我有具有实例变量的视图模型:
var capturedImageData: Data?
我需要在capturedimagedata接收到数据之后取消unide uiimageView视图并设置映像,例如从相机捕获图像上。
您需要观察capturedImageData
您可以创建capturedImageData
的behaviorRelay
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
来确保其在主线程上运行。