这两个同类的实例? (ReactiveCocoa文档示例)

时间:2014-05-27 19:39:48

标签: objective-c cocoa reactive-cocoa

我不知道RACSignal对象来自ReactiveCocoa github文档中的以下示例。

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。

在这个例子中,是否应该读取`databaseClient&#39; RAC示例中的类实际上是RACSignal的子类?或者,是否以某种方式创建的信号未显示?

目前使用Reactive Cocoa 2.3运行MacOS 10.9.3。文档来自ReactiveCocoa 3.0分支。

1 个答案:

答案 0 :(得分:2)

在ReactiveCocoa代码中,相当惯用的方法是命名一个方法,该方法以类似的方式返回一个直接返回值的方法。换句话说,即使返回信号的方法实际上没有直接执行操作(当执行方法时),它也会给出一个方法名称,表明它确实存在。

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

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

此方法的RAC-ified版本可能会这样命名:

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

起初看起来有点不直观,因为从技术上讲,方法不会查询数据库 - 相反,它会返回一个信号,导致查询数据库当信号订阅时 - 但这是惯例。您不必在自己的代码中遵守惯例,但仔细阅读OctoKit源代码会告诉您这种情况并不少见。

  

在这个例子中,是否应该读取RAC示例中的databaseClient类实际上是RACSignal的子类?或者,是否以某种方式创建的信号未显示?

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

@interface MyDatabaseClient : NSObject

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

@end