我有三个表示相互依赖属性的信号:城市,表演者和事件。
如果城市被更改或设置为nil,它还会将表演者和事件设置为nil。
当发生这种情况时,对这些信号的combineLatest订阅将触发三次 - 一次针对城市,然后再次将表演者设置为nil,然后再次将事件设置为nil。
所有三个人都需要进行combineLatest调用,因为事件或表演者可能会在没有城市变化的情况下改变。
是否有更好的模式(理想情况下不使用限制 - 故意减慢我的应用程序是一个痛苦的解决方案),这使得我可以将combineLatest只调用一次?理想情况下,只要城市发生变化,表演者和事件就会设置为零,然后调用combineLatest方法。
谢谢!
答案 0 :(得分:2)
如果您在属性上使用RACObserve()
,则需要将performer
和event
属性的后备实例变量设置为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
应用于这些属性观察。