活性可可,结合最多次烧制

时间:2014-09-08 19:19:09

标签: reactive-cocoa

我有三个表示相互依赖属性的信号:城市,表演者和事件。

如果城市被更改或设置为nil,它还会将表演者和事件设置为nil。

当发生这种情况时,对这些信号的combineLatest订阅将触发三次 - 一次针对城市,然后再次将表演者设置为nil,然后再次将事件设置为nil。

所有三个人都需要进行combineLatest调用,因为事件或表演者可能会在没有城市变化的情况下改变。

是否有更好的模式(理想情况下不使用限制 - 故意减慢我的应用程序是一个痛苦的解决方案),这使得我可以将combineLatest只调用一次?理想情况下,只要城市发生变化,表演者和事件就会设置为零,然后调用combineLatest方法。

谢谢!

3 个答案:

答案 0 :(得分:2)

如果您在属性上使用RACObserve(),则需要将performerevent属性的后备实例变量设置为nil,而不调用这些属性' setter方法(当city属性发生变化时):

- (void)setCityWithNillingBehavior:(City *)city
{
    _event = nil;
    _performer = nil;
    self.city = city;
}

我知道你正在寻找一种在ReactiveCocoa框架内实现这一目标的方法,但除非你想参与一些凌乱的有状态欺骗(比如使用触发city的{​​{1}}触发-if:then:else:,否则它实际上是不可能的。 1}})。呸。

答案 1 :(得分:2)

没有任何方法可以直接使用ReactiveCocoa执行此操作。只要三个属性中的任何一个发生更改,就会调用combineLatest逻辑,但这些属性都会相互影响。当一个改变时,另外两个改变。

概念上combineLatest正在做正确的事情!

油门很短?即使是零秒延迟?这实际上是JavaScript应用程序中的常见技巧,其中setTimeout(0)用于将某些代码推迟到下一个运行循环:

Why is setTimeout(fn, 0) sometimes useful?

如果您的combineLatest代码正在执行UI逻辑 - 您的用户将不会注意到差异!

答案 2 :(得分:2)

nil次更新对您的+combineLatest:订阅者是否重要?如果没有,您可以将ignore:nil应用于这些属性观察。