Once All Are Done Do Something With All
, можно достичь с помощью:
[[RACSignal combineLatest:@[connectUsersSignal,facebookUsersSignal,applicationUsersSignal]] subscribeNext:^(RACTuple *users) {
NSArray *connectedUsers = [users first];
NSArray *facebookUsers = [users second];
NSArray *applicationUsers = [users third];
}];
Другая часть отсутствует, как вы делаете applicationUsersSignal
зависит от facbookUsersSignal
. Что можно сделать следующим образом:
- (RACSignal *)applicationUsersSignalWithFacebookUsersSignal:(RACSignal *)fbSignal
{
return [fbSignal flattenMap:^RACStream *(NSArray *facebookUsers) {
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// Do what you have to do with the facebookUsers
return nil;
}];
}];
}
Просто добавьте немного больше ответа. Я предполагаю, что это холодные сигналы (сигналы, которые еще не начались, хотя и не были подписаны). Таким образом, идея использования combineLatest:
заключается в том, что вы хотите захватить точку, в которой каждый отдельный сигнал отправляется как минимум один next
, after that you subscribe to it so it can begin. Наконец, вы можете получить их значения от RACTuple
.
Я снова прочитал ваш вопрос, и вы хотите, чтобы они пришли все в одном массиве:
[[[RACSignal combineLatest:@[connectUsersSignal,facebookUsersSignal,applicationUsersSignal]] map:^id(RACTuple *allArrays) {
return [allArrays.rac_sequence foldLeftWithStart:[NSMutableArray array] reduce:^id(id accumulator, id value) {
[accumulator addObjectsFromArray:value];
return accumulator;
}];
}] subscribeNext:^(NSArray *allUsers) {
// Do Something
}];
кажется, что последний фрагмент кода может быть упрощена с помощью 'combineLatest: reduce' –
@ MichałCiuba вас будет получать 3 массива в 'combLatest: reduce:', который отличается от того, чтобы все 3 массива были сплющены в один. – Peres
@RuiAAPeres Вы можете использовать 'combLatest: reduce:', чтобы избежать вызовов 'allArrays.first',' allArrays.second' и т. Д. Но в этом случае вы можете просто получить «rac_sequence» из самого кортежа, а «map» остается соответствующей операцией. –