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