RxSwift 观察数组中struct类型的变量字段

RxSwift Observe variable fields of struct type in array

我在观察具有变量字段的自定义类型数组时遇到问题。我想创建可观察事件,它将检查此字段的值是否已更改。 我有一个结构:

struct Type {
    let name: Variable<String>
    let email: Variable<String>
}

我有一个数组:

let array: Variable<[Type]>

我只需要 Observable,当字段名称计数大于 0 时,它将 return 为真。我尝试使用 Observable.combineLatest,但我无法正确转换数组。

首先,您不应该再使用 Variable,因为它已被弃用。您应该改用 BehaviorRelay

我不确定我是否清楚地理解你的问题。但你可能需要这样的东西:

// namesNotEmpty will be true if all elements in array have name.count > 0
let namesNotEmpty: Observable<Bool> = array.asObservable()
  .flatMap { array -> Observable<[String]> in
    if array.isEmpty {
      // so that some event is emmited when array is empty
      return Observable.just([""])
    }

    return Observable.combineLatest(array.map { [=10=].name.asObservable() })
  }
  .map { array in
    array.filter { [=10=].isEmpty }.isEmpty
  }

我们知道 Variable 已被弃用,Variable 只是 BehaviorSubject (nice comment about that) 私有实例的薄包装。因此,您可以改用 BehaviorSubject

接下来,把 Rx 类型放在你想要的任何地方都不是个好主意。更好的方法是将数组和 Rx 属性 分开。

例如:

struct CustomType {
    let name: String
    let email: String
}

private var array: [CustomType] = [] {
    didSet {
        if array.first(where: { [=10=].name.isEmpty }) == nil {
            subject.onNext(())
        }
    }
}

var subject = PublishSubject<Void>()

...

// and handle changes
subject.subscribe(onNext: {
    // logic
})

这里我们有纯 CustomType 对象数组,当 if 条件正确时触发 subject 发送事件。这样更好更清晰,因为你的逻辑是分开的。

P.S。另外,如果你不擅长*Subject,我建议你google,因为你的代码可能需要另一种*Subject