2014-09-11 3 views
0

Я относительно новичок в ReactiveCocoa и задавался вопросом, как объединить последовательность вызовов REST GET, чтобы они выполнялись по порядку. Если одна из ошибок звонков, то весь процесс откатится.Цепочка RACSignals и откат

Так что я использую pod 'AFNetworking-RACExtensions', '0.1.1' У меня есть NSArray сигналов. Большинство из этих сигналов выглядит следующим образом:

- (RACSignal *) form 
{ 
@weakify(self); 

RACSubject *repSubject = [RACSubject subject]; 
[[ServiceClient getForm] subscribeNext:^(RACTuple *jsonTuple) { 
    if ([jsonTuple second]) 
    { 
     // create core data objects here    
     [repSubject sendNext: nil]; 
     [repSubject sendCompleted]; 
    } 
} error:^(NSError *error) { 
    [repSubject sendError: error]; 
}]; 
return repSubject;  
} 

Так нагрузка сигналов, как это есть в NSArray. Я хочу обрабатывать эти вызовы в том порядке, в котором они появляются в массиве один за другим, и иметь общий обработчик ошибок и блок завершения. Я думаю, что я имел успех не используя NSArray и имел такой код:

@weakify(self); 
[[[[[[self form] flattenMap:^(id value) { 
    // perform your custom business logic 
    @strongify(self); 
    return [self signal2]; 
}] flattenMap:^(id value) { 
    // perform your custom business logic 
    @strongify(self); 
    return [self signal3]; 
}] flattenMap:^(id value) { 
    // perform your custom business logic 
    @strongify(self); 
    return [self signal4]; 
}] flattenMap:^(id value) { 
    // perform your custom business logic 
    @strongify(self); 
    return [self signal5]; 
}] subscribeError:^(NSError *error) { 
     @strongify(self); 
     [self handleError: error]; 
    } completed:^{ 
     // Successful Full Sync 
     // post notification 
    }];  

Как я могу сделать все это с помощью NSArray сигналов, все еще будучи в состоянии использовать subscribeError и завершил блоки?

Я предполагаю, что это что-то вроде:

@weakify(self); 
[[[array.rac_sequence flattenMap:^RACStream *(id value) { 
    // dunno what to do 
}] subscribeError:^(NSError *error) { 
     @strongify(self); 
     [self handleError: error]; 
    } completed:^{ 
     // Successful Full Sync 
     // post notification 
    }]; 

ответ

3

Во-первых, мы преобразовать RACSequence в поток-из-потоков по - signalWithScheduler:. Затем мы можем слить поток потоков в сигнал нового потока через - flatten. После этого мы можем использовать его как обычный поток.

И ДА, если вам не нужно обрабатывать каждый ответ, вы можете, конечно, использовать - subscribeError: completed:.

[[[[array rac_sequence] signalWithScheduler:[RACScheduler immediateScheduler]] flatten] subscribeNext:^(id x) { 
    // Handle each results 
} error:^(NSError *error) { 
    // Handle error 
} completed:^{ 
    // Completed 
}]; 
+0

Блестящий, что, похоже, хорошо работает, спасибо. Это довольно сложная первая строка, могу ли я попросить более подробно о том, что там происходит? Кроме того, если каждый сигнал будет когда-либо возвращать нуль, может ли вызов subscribeNext быть устранен в вашем решении? – elprl

+0

Спасибо за редактирование. Мощный материал. – elprl

Смежные вопросы