【问题标题】:RxSwift Observe variable fields of struct type in arrayRxSwift 在数组中观察结构类型的变量字段
【发布时间】:2018-03-23 16:37:10
【问题描述】:

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

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

我有一个数组:

let array: Variable<[Type]>

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

【问题讨论】:

  • 你想观察你的变量array,如果所有元素的name.count都大于零或者我错过了什么,则返回true?
  • 是的,你是对的。这就是我需要的。

标签: ios swift rx-swift


【解决方案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
  }

【讨论】:

  • 对不起,isEmpty 修饰符不能与 Variable 字段一起使用(BehaviorRelay 也是)。
  • @MiXen 对不起,我会更新我的答案,你必须使用$0.name.value.isEmpty
  • 这很奇怪,我更新了我的变量,但订阅者没有触发新事件。
  • 哦,我现在明白你的问题了。我会在一分钟内用希望有效的解决方案更新我的答案。
  • 是的,这就是我要找的,但我发现我有一个问题,即当主数组为空时,天文台被阻塞。也许你知道,它有什么问题?
【解决方案2】:

我们知道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 对象数组,当if 条件正确时触发subject 发送事件。这更好更干净,因为你的逻辑是分开的。

附:另外,如果你不擅长*Subject,我建议你google一下,因为你的代码可能需要另一种*Subject

【讨论】:

  • 对不起,我确实需要 struct 中的变量字段,这个解决方案对我没用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
  • 2012-06-05
相关资源
最近更新 更多