【问题标题】:ReactiveCoca Design Pattern for Forwarding / Chaining Signals用于转发/链接信号的 ReactiveCoca 设计模式
【发布时间】:2016-07-16 12:08:00
【问题描述】:

我有以下类和方法:

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];

}

Class B 中设计requestData 以便results 数组可以在Class C 中访问的最佳方法是什么。

我应该使用[array rac_sequence] 以某种方式转发数组吗? 我应该在 requestData 中创建一个新信号,requestData 是否应该返回 RACSignal 而不是 void

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

【问题讨论】:

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

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


【解决方案1】:

我相信您想在 B 类中使用 doNext 而不是 subscribeNext

【讨论】:

    【解决方案2】:

    我对您的用例并不完全清楚,但我认为您正在混合范式。 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 的引用并订阅它以访问其最后一个值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      相关资源
      最近更新 更多