如何使用 Rxswift 获取 UIImageView 的 Observable is Empty?

How to get a Observable of UIImageView is Empty by Using Rxswift?

我想通过使用 Rxswift 获得一个 Observable of UIImageView is Empty。

这是我的代码:

let usernameValid = firstTextField.rx.text.orEmpty
    .map { [=10=].characters.count >= 1 }
    .shareReplay(1)

let passwordValid = secondTextField.rx.text.orEmpty
    .map { [=10=].characters.count >= 1 }
    .shareReplay(1)

let everythingValid = Observable.combineLatest(usernameValid, passwordValid) { [=10=] &&  }
    .shareReplay(1)

everythingValid.bindTo(submitButton.rx.isEnabled).addDisposableTo(disposeBag)

我想获得类似 usernameValid 的 Observable。

UIImageView 上的 .rx.image 属性 是 UIBindingObserver 类型。此类型不实现 ObservableType,因此您将无法简单地编写 imageView.rx.image.orDefault(defaultImage).

如果您想观察 UIImageViewimage 属性,您需要使用 KVO。

// this is "equivalent" to `firstTextField.rx.text`
let imageObs: Observable<UIImage?> = imageView.rx.observe(Optional<UIImage>.self, "image")

// default image will act in the same way the empty string is used in the case of `orEmpty`
let defaultImage = UIImage(named: "defaultImage")!
let imageWithDefaultObs: Observable<UIImage> = imageObs.map { 
  // return defaultImage when [=10=] is nil
  return [=10=] ?? defaultImage
}

你也可以写 isEmpty 属性 作为 Reactive

的扩展
extension Reactive where Base: UIImageView {
    var isEmpty: Observable<Bool> {
        return observe(UIImage.self, "image").map{ [=11=] == nil }
    } 
}
// Usage:
imageView.rx.isEmpty.subscribe(onNext: { isEmpty in 
    /** do something */ 
}).disposed(by: disposeBag)

swift 5

lazy var image: Observable<UIImage?> = imageView.rx.observe(UIImage.self, "image")