我在观察具有可变字段的自定义类型数组时遇到问题。我想创建可观察事件,如果此字段的值发生更改,则会检查该事件。 我有一个结构:
struct Type {
let name: Variable<String>
let email: Variable<String>
}
我有一个阵列:
let array: Variable<[Type]>
所有我需要的是Observable,当字段名称计数大于0时,它将返回true。我尝试使用Observable.combineLatest,但我无法正确转换数组。
答案 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
只是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: { $0.name.isEmpty }) == nil {
subject.onNext(())
}
}
}
var subject = PublishSubject<Void>()
...
// and handle changes
subject.subscribe(onNext: {
// logic
})
这里有一些纯CustomType
个对象,当subject
条件正确时触发if
发送事件。这更好,更清洁,因为你的逻辑是分开的。
P.S。另外,如果你不擅长*Subject
,我建议你谷歌一下,因为也许你的代码需要另一种*Subject
。