我不知道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分支。
答案 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