如何订阅更改图像

时间:2017-07-21 13:15:25

标签: ios swift rx-swift

我有自己的图像类(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)
}

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

1 个答案:

答案 0 :(得分:2)

您需要将明亮的图像导出为Observable。如果您将brightness(n:)函数作为UIImage的扩展而不是创建自定义类,这会更简单...

一些注意事项:

  • ViewModels 需要处理行李。如果你在视图模型中放置一个,那么你可能做错了。
  • 我认为UICustomImage可以通过致电UIImage返回更新的asImage
  • 我认为brightness(n:)没有返回值。

请注意我在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: $0)
                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)
    }
}