用于转发/链接信号的ReactiveCoca设计模式

时间:2016-07-16 12:08:01

标签: ios objective-c functional-programming reactive-cocoa

我有以下类和方法:

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吗?

非常感谢任何帮助或指导。感谢。

2 个答案:

答案 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的引用并订阅它以访问其上一个值