我有以下类和方法:
A类
- (RACSignal *)createX
{
NSDictionary *parameters = @{};
return [[[[HTTPClient sharedClient] rac_POST:@"X/" parameters:parameters]
map:^id(OVCResponse *response) {
[self logResponse:response];
return response.result;
}] catch:^RACSignal *(NSError *error) {
return [RACSignal error:[self handleError:error]];
}];
}
B类
- (void)requestData
{
[[self.myClassA createX]
subscribeNext:^(NSArray *results) {
DDLogDebug(@"response : %@", results);
}
error:^(NSError *error) {
[self.dataManager sendError:error];
}];
}
C类
- (void)retrieveData
{
[self.myClassB requestData];
}
在requestData
中设计Class B
的最佳方式是什么,以便results
可以访问Class C
数组。
即
我应该使用[array rac_sequence]
以某种方式转发数组,
如果我在requestData中创建新信号,requestData
应该返回RACSignal
而不是void
吗?
非常感谢任何帮助或指导。感谢。
答案 0 :(得分:1)
我相信你想在B组中使用doNext
而不是subscribeNext
。
答案 1 :(得分:0)
我在这里的用例并不完全清楚,但我认为你正在混合范式。 RAC的东西总是异步的,所以为了同步访问网络请求的结果,你必须以某种方式存储它。
您可以将结果绑定到ClassB上的属性,也可以使用RACCommand
,例如:
[[RACCommand alloc] initWithEnabled:RACObserve(self, valid) signalBlock:^RACSignal *(id input) {
return [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//make network call
//send responseObject to subscriber
[subscriber sendNext:responseObject];
//[subscriber sendError:#NSError#] //send error if something went wrong
[subscriber sendCompleted];
return nil;
}] materialize];
}];
然后,您可以订阅executionSignals
的{{1}},该RACCommand
为您在上述块中控制的命令的每次执行流式传输RACSignal
。
所以我认为你的选择是:
RACCommand
模式,再多看一遍RACSignal
replay()
或replayLast()
here,然后您可以存储对RACSignal
的引用并订阅它以访问其上一个值