将多个网络请求与ReactiveCocoa结合使用

时间:2013-06-07 11:14:15

标签: afnetworking chaining reactive-programming reactive-cocoa

我正在探索ReactiveCocoa并试图了解什么是可能的。我遇到的问题是将一些网络请求链接在一起。

我有2个调用,第一个获取标识符列表,然后对于每个标识符,我调用以获取与该id相对应的数据并创建模型对象并返回对象数组。

我正在使用RACExtensions进行AFNetworking来发出请求。代码看起来像这样:

- (RACSignal *) identifersInfo
{
    return [[[[self identifiersSignal] flattenMap:^RACStream *(RACTuple *tuple) {
        RACTupleUnpack(AFHTTPRequestOperation *operation, id responseObject) = tuple;
        NSArray *identifiers = responseObject[@"Identifiers"];
        NSArray *requests = [self httpRequestsWithIdentifiers: identifiers];
        return [self.client rac_enqueueBatchOfHTTPRequestOperationsWithRequests: requests];
    }] collect] map:^id(RACTuple *tuple) {
        RACTupleUnpack(AFHTTPRequestOperation *operation, id responseObject) = tuple;
        Model *model = [[Model alloc] init];
        model.title = responseObject[@"Title"];
        model.description = responseObject[@"Description"];
        model.lastUpdated = responseObject[@"LastUpdated"];
        return model;
    }];
}

identifiersSignal方法如下所示:

- (RACSignal *) identifiersSignal
{
    return [self.client rac_getPath: @"identifiers" parameters: nil];
}

这会返回如下所示的json字典:

{
  "Identifiers": [
    3,
    4,
    21
  ]
}

我实际上是在嘲笑这些电话,我知道它们是独立工作的,我只是想用ReacticeCocoa将它们拼凑在一起。

我无法弄清楚或找到任何关于如何使用ReactiveCocoa实现这一目标的合适样本,尽管我非常有信心。

1 个答案:

答案 0 :(得分:0)

我不得不研究AFNetworking扩展的实现,但我认为你滥用了一些返回值。我还没有测试,但看起来你的代码应该是这样的:

- (RACSignal *) identifersInfo {
    return [[[self identifiersSignal] map:^RACSignal *(RACTuple *tuple) {
        RACTupleUnpack(AFHTTPRequestOperation *operation, id responseObject) = tuple;
        NSArray *identifiers = responseObject[@"Identifiers"];
        NSArray *requests = [self httpRequestsWithIdentifiers: identifiers];
        return [self.client rac_enqueueBatchOfHTTPRequestOperationsWithRequests: requests];
    }] map:^Model*(id *reponseObject) {
        Model *model = [[Model alloc] init];
        // same as above
        return model;
    }];
}

rac_getPath返回RACTuple,因为rac_enqueueBatchOfHTTPRequestOperationsWithRequests只返回RACStream个返回对象,这有点误导。 AFURLConnectionOperation+RACSupport.m应使用类型信息改进头文件中的文档以使其理顺。

不错的代码。