使用ReactiveCocoa触发模型持久性是否有意义

时间:2013-05-30 20:06:43

标签: objective-c cocoa design-patterns reactive-cocoa

我正试图进入Reactive世界,并且在最佳实践方面仍然发现我的理解不足。 ReactiveCocoa似乎最常用于MVC的VC端。我一直在寻找一种在模型中使用它的方法。

我的想法是在我的模型对象上有一个名为' saveRequests '的 RACSubject 属性 - 当模型对象中的某些内容发生变化时,它会调用' sendNext < / em>:'在其 saveRequests 属性上......基本上将自己标记为脏。

AppDelegate 中,我订阅了我的父模型对象的 saveRequests 信号,并在下一个信号上保存到磁盘(每2秒缓冲一次,以避免磁盘操作过载)。这似乎有效,但我希望通过级联saveRequest信号来进一步发展。

我有一个拥有其他模型对象数组的模型对象。当其中一个对象触发saveRequest信号时,我希望父对象依次触发其saveRequest信号。我有这个工作,让父母在添加它时订阅每个子对象。

但是,当从父级移除子模型对象时,我希望父级取消订阅来自子级的任何进一步的saveRequests - 我知道只有当子对象被dealloc'd时才会自动取消订阅(这可能不会直接发生如果孩子被其他东西抓住了就离开了。

所以,有几个问题:

  • 这是一个明智的想法,作为模型将自己标记为脏并触发持久性的一种方式吗?
  • 我已经读过 RACSubject 可能不是最好用的 - 我应该使用 RACSignal ,为什么?
  • 为了取消订阅每个子对象,我需要使用 RACDisposable ,对吗?是唯一的方法来使用我订阅信号时返回的那个,在这种情况下,我是否需要在父对象中挂起它?
  • 关于级联saveRequest信号,我在这里重新制作方形轮吗?似乎有很多方法可以使用RAC API - 有没有更好的解决方案可以满足我的需求?

提前致谢 - 这种反应性的东西很吸引人,但需要转变思维方式,如果不遵循最佳实践,似乎很容易被滥用。

劳里

1 个答案:

答案 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