2016-07-16 8 views
1

我有以下类和方法:ReactiveCoca设计模式的转发/链接信号

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 in Class B,使得可以在Class C中访问results阵列。

我应该转发阵列使用[array rac_sequence]某种程度上, 我应该创建内部的RequestData一个新的信号,应requestData返回的RACSignal代替void

任何帮助或指导将不胜感激。谢谢。

+0

我不熟悉reactive-cocoa,但是您应该在retrieveData方法中添加一个block参数,当结果可用时调用它。 C类然后可以指定它想要对结果做什么。 – fishinear

回答

1

我相信你想在B类

0

使用doNext,而不是subscribeNext我并不完全清楚您的使用情况下,在这里,但我认为你是混合范例。 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]; 
}]; 

然后,您可以订阅RACCommandexecutionSignals这对于命令的每次执行流的RACSignal您可以在上述的模块中进行控制。

所以我觉得你的选择是:

  • RACCommand模式,看看它有点网络通话更
  • 连接结果为属性的同步访问
  • 返回RACSignal你描述时调用方法
  • 可能查看replay()replayLast()here,因为您可以存储对RACSignal的引用并订阅它以访问其最后的值