如何观察 SignalProducer 数组的新值
how to observe new values of an SignalProducer array
我有一个 SignalProducer
包含一个数组,我只想观察新的变化而不是在观察它时得到整个数组
我尝试了 flatMap .latest
但它不起作用
有人知道怎么做吗?
没有一个函数可以做到这一点,但您可以使用 combinePrevious
来实现:
let change = producer.combinePrevious([]).map { (previous, current) in
// Calculate change
return change
}
然而,如何计算前一个数组和当前数组之间的变化取决于 "only new changes" 在您的上下文中的确切含义。
添加的元素是否需要?已删除的元素?是否允许重复?位置重要吗,有变化包括位置的变化吗?
如果你只需要已经添加的元素并且没有重复,我建议使用 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([=11=]) }
p.value = [1, 2, 3, 4]
p.value = [2, 4]
p.value = [1, 2, 3, 4, 5, 6]
我相信 .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([=11=])})
}).startWithValues {newValues in
//do your stuff here
}
我有一个 SignalProducer
包含一个数组,我只想观察新的变化而不是在观察它时得到整个数组
我尝试了 flatMap .latest
但它不起作用
有人知道怎么做吗?
没有一个函数可以做到这一点,但您可以使用 combinePrevious
来实现:
let change = producer.combinePrevious([]).map { (previous, current) in
// Calculate change
return change
}
然而,如何计算前一个数组和当前数组之间的变化取决于 "only new changes" 在您的上下文中的确切含义。
添加的元素是否需要?已删除的元素?是否允许重复?位置重要吗,有变化包括位置的变化吗?
如果你只需要已经添加的元素并且没有重复,我建议使用 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([=11=]) }
p.value = [1, 2, 3, 4]
p.value = [2, 4]
p.value = [1, 2, 3, 4, 5, 6]
我相信 .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([=11=])})
}).startWithValues {newValues in
//do your stuff here
}