0

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

我目前的想法是在我的模型对象上拥有一个名为“ saveRequests ”的RACSubject属性- 当模型对象发生变化时,它会在其saveRequests属性上调用“ sendNext :” ...基本上将自己标记为脏。

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

我有一个模型对象,它拥有一组其他模型对象。当其中一个对象触发 saveRequest 信号时,我希望父对象依次触发其 saveRequest 信号。我通过让父对象在添加每个子对象时订阅它来实现这一点。

但是,当从父级删除子模型对象时,我希望父级取消订阅来自子级的任何进一步 saveRequests - 我知道只有在子对象被释放时才会自动取消订阅(如果孩子被别的东西抓住了)。

所以,有几个问题:

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

在此先感谢 - 这个反应式的东西很吸引人,但需要转变思维方式,如果不遵循最佳实践,似乎很容易被滥用。

劳里

4

1 回答 1

2

在 MVC 范例中,您的模型负责通知侦听器其更改。保持模型通常是由明确定义的条件触发的协调动作。如果您的模型需要在每次更改时都保持不变,那么您应该这样做。我认为没有针对它的最佳做法。节流和缓冲是一个好主意。

John Reid 有一篇关于这个主题的优秀文章。http://qualitycoding.org/mvc-tdd/他基本上解释了如何TDD(测试驱动开发)模型-视图-控制器系统。他使用通知从模型中获取更新,但在这方面与 ReactiveCocoa 有自然的交换。恕我直言,ReactiveCocoa 更好,因为它为您提供了一种通过 Disposables 处理订阅的明确方式,这些 Disposables 不像通知观察那样是隐藏状态。

至于你应该如何实现它,很大程度上取决于你的模型。对于一般的持久性实用程序,您可以查看轻量级 Github 的 Mantle https://github.com/github/Mantle或基于核心数据的 Magical Record https://github.com/magicalpanda/MagicalRecord

于 2013-06-04T13:34:25.413 回答