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

时间:2018-03-23 16:37:10

标签: ios swift rx-swift

我在观察具有可变字段的自定义类型数组时遇到问题。我想创建可观察事件,如果此字段的值发生更改,则会检查该事件。 我有一个结构:

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

我有一个阵列:

let array: Variable<[Type]>

所有我需要的是Observable,当字段名称计数大于0时,它将返回true。我尝试使用Observable.combineLatest,但我无法正确转换数组。

2 个答案:

答案 0 :(得分:1)

首先,您不应再使用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 { $0.name.asObservable() })
  }
  .map { array in
    array.filter { $0.isEmpty }.isEmpty
  }

答案 1 :(得分:0)

我们知道Variable已被弃用,Variable只是BehaviorSubjectnice comment about that)私有实例的精简包装。因此,您可以改为使用BehaviorSubject

接下来,将Rx类型放在您想要的任何地方并不是一个好主意。更好的方法是分别保留数组和Rx属性。

例如:

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

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

var subject = PublishSubject<Void>()

...

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

这里有一些纯CustomType个对象,当subject条件正确时触发if发送事件。这更好,更清洁,因为你的逻辑是分开的。

P.S。另外,如果你不擅长*Subject,我建议你谷歌一下,因为也许你的代码需要另一种*Subject