我正试图进入Reactive世界,并且在最佳实践方面仍然发现我的理解不足。 ReactiveCocoa似乎最常用于MVC的VC端。我一直在寻找一种在模型中使用它的方法。
我的想法是在我的模型对象上有一个名为' saveRequests '的 RACSubject 属性 - 当模型对象中的某些内容发生变化时,它会调用' sendNext < / em>:'在其 saveRequests 属性上......基本上将自己标记为脏。
在 AppDelegate 中,我订阅了我的父模型对象的 saveRequests 信号,并在下一个信号上保存到磁盘(每2秒缓冲一次,以避免磁盘操作过载)。这似乎有效,但我希望通过级联saveRequest信号来进一步发展。
我有一个拥有其他模型对象数组的模型对象。当其中一个对象触发saveRequest信号时,我希望父对象依次触发其saveRequest信号。我有这个工作,让父母在添加它时订阅每个子对象。
但是,当从父级移除子模型对象时,我希望父级取消订阅来自子级的任何进一步的saveRequests - 我知道只有当子对象被dealloc'd时才会自动取消订阅(这可能不会直接发生如果孩子被其他东西抓住了就离开了。
所以,有几个问题:
提前致谢 - 这种反应性的东西很吸引人,但需要转变思维方式,如果不遵循最佳实践,似乎很容易被滥用。
劳里
答案 0 :(得分:2)
在MVC范例中,您的模型负责通知侦听器其更改。持久化模型通常是由明确定义的条件触发的协调行动。如果您的模型需要在每次更改时保留,那么您应该这样做。我不认为有最好的做法反对它。节流和缓冲是一个好主意。
John Reid在这个主题上有一篇很好的帖子。 http://qualitycoding.org/mvc-tdd/他基本上解释了如何将TDD(Test Driven Develop)作为模型 - 视图 - 控制器系统。他使用通知从模型中获取更新,但在这方面,ReactiveCocoa有一个自然的交换。恕我直言ReactiveCocoa甚至更好,因为它为您提供了一种明确的方式来处理通过Disposables订阅,而Disposables不是隐藏状态,如通知观察。
至于如何实施它将在很大程度上取决于您的模型。对于常规持久性实用程序,您可以查看轻量级Github的Mantle https://github.com/github/Mantle或基于核心数据的Magical Record https://github.com/magicalpanda/MagicalRecord。