如何观察 SignalProducer 数组的新值



我有一个包含数组的SignalProducer,我只想观察新的变化,而不是在观察它时获取整个数组

我尝试平面地图.latest但它不起作用

有人知道如何做到这一点吗?

我相信.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
}

没有一个函数可以做到这一点,但你可以通过使用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]

相关内容

  • 没有找到相关文章

最新更新