3

Я изучаю ReactiveCocoa и пытаюсь выяснить, что возможно. Проблемы, которые возникают у меня, связаны друг с другом несколькими сетевыми запросами.Объединить несколько сетевых запросов с помощью 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

Задать вопрос «[Зависимые от цепи сигналы в ReactiveCocoa] (http://stackoverflow.com/questions/15797081/chaining-dependent-signals-in-reactivecocoa/15827396)» и аналогичный [раздел в README] (https://github.com/ReactiveCocoa/ReactiveCocoa#chaining-dependent-operations). В папке [Документация] (https://github.com/ReactiveCocoa/ReactiveCocoa/tree/master/Documentation) также имеется большая информация, как объяснение [основных операторов] (https://github.com/ ReactiveCocoa/ReactiveCocoa/блоб/ведущий/Документы/BasicOperators.md). –

ответ

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 Документацию в файлах заголовков следует улучшить с информацией о типе, чтобы получить это исправление.

Хороший код, однако.