如何订阅更改图片

How to subscribe to changes image

我有自己的图片 class (UICustomImage)。

如何跟踪图片的变化并更新GLKView?

ViewModel:

final class ViewModel {

private let disposeBag = DisposeBag()

let image: UICustomImage
let sliderValue: Variable<Float>

init(image: UIImage) {

    self.sliderValue = Variable(Float(0.0))

    self.image = UICustomImage(image: image)        

    self.sliderValue.asObservable()
        .subscribe(onNext: { (value) in
            self.image.brightness(n: value)
        })
        .disposed(by: disposeBag)
}

}

ViewController:

@IBOutlet var slider: UISlider!

private let disposeBag = DisposeBag()
private var viewModel: ViewModel!

var image: UIImage?

override viewDidLoad() {
    viewModel = ViewModel(image: image!)

    slider.rx.value
        .subscribe(onNext: { value in
            self.viewModel.sliderValue.value = value
        })
        .disposed(by: disposeBag)
}

我希望图片在滑块移动时更新。

您需要将亮化后的图像导出为 Observable。如果您将 brightness(n:) 函数作为 UIImage 的扩展而不是自定义 class...

,这会简单得多

一些注意事项:

  • ViewModels 不需要 处理包。如果你在你的视图模型中放置一个,你可能做错了什么。
  • 我假设 UICustomImage 可以 return 通过调用 asImage 更新 UIImage
  • 我假设 brightness(n:) 没有 return 值。

请注意我是如何让 image 成为 sliderValue 上的因变量的。

final class ViewModel {

    let image: Observable<UIImage>
    let sliderValue: Variable<Float>

    init(image: UIImage) {

        sliderValue = Variable(Float(0.0))

        self.image = sliderValue.asObservable()
            .map { let image = UICustomImage(image: image)
                image.brightness(n: [=10=])
                return image.asImage
            }
    }
}

关于视图控制器的注释:

  • 您忘记打电话给 super.viewDidLoad()。你必须始终这样做。
  • 我隐式解包了 image。也可能因为代码在任何情况下都会在没有图像的情况下崩溃。
  • 我将您的订阅转换为绑定。看起来更干净了。

将 viewModel 的图像 属性 设置为可观察对象后,您需要做的就是将其绑定到图像视图。

final class ViewController: UIViewController {

    @IBOutlet weak var slider: UISlider!
    @IBOutlet weak var imageView: UIImageView!

    private let disposeBag = DisposeBag()
    private var viewModel: ViewModel!

    var image: UIImage!

    override func viewDidLoad() {
        super.viewDidLoad()
        viewModel = ViewModel(image: image)

        slider.rx.value
            .bind(to: viewModel.sliderValue)
            .disposed(by: disposeBag)

        viewModel.image
            .bind(to: imageView.rx.image)
            .disposed(by: disposeBag)
    }
}