如何观察SignalProducer阵列的新值

时间:2018-10-24 06:34:19

标签: swift reactive reactive-swift

我有一个SignalProducer,其中包含一个数组,我只想观察新的变化,而不是观察到整个数组

我尝试了flatMap .latest,但是它不起作用

任何人都知道该怎么做吗?

2 个答案:

答案 0 :(得分:0)

没有可用的单个函数可以执行此操作,但是您可以使用combinePrevious来实现:

let change = producer.combinePrevious([]).map { (previous, current) in
  // Calculate change
  return change
}

但是,计算上一个数组与当前数组之间的变化的方式取决于上下文中“仅新变化”的确切含义。

是否要添加元素?元素已被删除?是否允许重复?职位是否重要,是否有变动以包括职位变动?

如果您只需要添加的元素且没有重复的元素,建议使用Set而不是Array

例如:

let p = MutableProperty([1, 2, 3])

let added = p.producer.map(Set.init)
  .combinePrevious([])
  .map { (previous, current) in
    return current.subtracting(previous)
}

added.startWithValues { print($0) }

p.value = [1, 2, 3, 4]
p.value = [2, 4]
p.value = [1, 2, 3, 4, 5, 6]

答案 1 :(得分:0)

我相信.skipRepeats()操作员会为您完成这项工作。

它将转发不等于其立即进行的值的值,它也适用于数组。

请记住,您的数组元素应符合Equatable

yourProducer.skipRepeats().startWithValues {newValues in
            //do your stuff here
        } 

这也很好用,因为它过滤新值并仅转发不同的值:

yourProducer.combinePrevious().map({val -> [String] in
            let (prev, current) = val
            return current.filter({!prev.contains($0)})
        }).startWithValues {newValues in
            //do your stuff here
        }