【问题标题】:Are These Two Instance of the Same Class? (ReactiveCocoa Documentation Examples)这两个实例是同一个类吗? (ReactiveCocoa 文档示例)
【发布时间】:2014-05-27 19:39:48
【问题描述】:

我不明白 ReactiveCocoa github 文档中以下示例中的 RACSignal 对象来自哪里。

Parallelizing independent work下,首先展示的是经典的objective-c版本:

__block NSArray *databaseObjects;
__block NSArray *fileContents;

NSOperationQueue *backgroundQueue = [[NSOperationQueue alloc] init];
NSBlockOperation *databaseOperation = [NSBlockOperation blockOperationWithBlock:^{
    databaseObjects = [databaseClient fetchObjectsMatchingPredicate:predicate];
}];

很明显,[databaseClient fetchObjectsMatchingPredicate:predicate] 返回一个数组。但是,在响应式版本中:

RACSignal *databaseSignal = [[databaseClient
    fetchObjectsMatchingPredicate:predicate] // <== this should also be an array
    subscribeOn:[RACScheduler scheduler]]; // ,<== subscribeOn: is a RACSignal Method only

... 看起来相同的方法应该返回的不是数组(具有 rac_sequeance 属性)而是 RACSignal。

在这个例子中,是不是意味着RAC例子中的`databaseClient'类实际上是RACSignal的一个子类?或者,是否以某种方式创建的信号未显示?

当前运行带有 Reactive Cocoa 2.3 的 MacOS 10.9.3。文档来自 ReactiveCocoa 3.0 分支。

【问题讨论】:

  • 不确定我是否同意标题编辑,它对答案的问题很大。
  • 那么我可能误解了你的问题。你能澄清这个问题并重新命名吗?
  • 为什么fetchObjectsMatchingPredicate 在顶部版本中返回一个数组,但在底部显然是一个信号? database 在每个示例中是假定为同一个类还是两个不同的类,一个是为操作编写的,一个是为 RAC 编写的?文档说 RAC 示例只是非 RAC 版本的“清理和优化”版本,这对我来说意味着它在两个版本中是相同的类和方法。如果是这样,我不明白信号来自哪里。
  • 这种类型的瘫痪是我真正需要从 RAC 获得的,所以我了解如何去做很重要。
  • 我在下面更新了我的答案,以便在回答您的确切问题时更有帮助。认为类的 ReactiveCocoa 版本与非 ReactiveCocoa 版本完全不同。学习一下 OctoKit 源码可能会对你有所帮助,里面有很多这样的方法。

标签: objective-c cocoa reactive-cocoa


【解决方案1】:

在 ReactiveCocoa 代码中,以与直接返回值的方法类似的方式命名返回信号的方法是相当惯用的。换句话说,即使返回信号的方法实际上并没有直接执行操作(当方法被执行时),它被赋予了一个暗示它执行的方法名称。

例如,查询数据库并直接返回查询结果的方法可能会这样命名:

- (DBResult *)queryDatabase:(DBQuery *)query;

而此方法的 RAC 化版本可能会这样命名:

- (RACSignal *)queryDatabase:(DBQuery *)query;

一开始可能看起来有点不直观,因为从技术上讲,该方法查询数据库 - 相反,它返回一个信号,导致查询数据库的操作订阅了信号——但这是约定俗成的。您不必在自己的代码中遵守约定,但仔细阅读 OctoKit 源代码会发现它并不少见。

在这个例子中,是不是意味着 RAC 例子中的databaseClient 类实际上是 RACSignal 的一个子类?或者,是否以某种方式创建的信号未显示?

在本例中,databaseClient 不是 RACSignal 的子类。它只是一个响应-fetchObjectsMatchingPredicate:消息的对象,并从相应的方法返回一个RACSignal。假设,对象的类可能类似于:

@interface MyDatabaseClient : NSObject

- (RACSignal *)fetchObjectsMatchingPredicate:(NSPredicate *)predicate;

@end

【讨论】:

  • 所以每个例子中数据库客户端的类都不一样或者至少fetch...方法有时会返回一个数组而其他人是一个信号?
  • 正确。班级不一样。该示例省略了细节,但旨在演示一个完全不同的方法(恰好具有非常相似的名称),如果代码更改为使用 ReactiveCocoa。
  • 好的,这就是我想知道的。我可能会犹豫并建议他们明确表示。
猜你喜欢
  • 2019-09-29
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多