Получить RACTuple из объединенных сигналов

Я понятия не имею, как объединить множество сигналов и получить результаты от RACTuple, это кажется простым ответом, но я не могу его найти.

Что у нас есть, например:

NSArray *a = @[@{@"k1":@"v1"},
               @{@"k2":@"v2"},
               @{@"k3":@"v3"},
               @{@"k4":@"v4"},
               @{@"k5":@"v5"},
               @{@"k6":@"v6"},
               @{@"k7":@"v7"}];
NSArray *b = @[@{@"kk1":@"vv1"},
               @{@"kk2":@"vv2"},
               @{@"kk3":@"vv3"},
               @{@"kk4":@"vv4"},
               @{@"kk5":@"vv5"},
               @{@"kk6":@"vv6"},
               @{@"kk7":@"vv7"}];

а также

     RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
            RACSignal *s1 = [self adaptObjects:a];
            RACSignal *s2 = [self adaptObjects:b];
            return [[RACSignal merge:@[s1,s2]] map:^id(id value) {
                return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
                    [subscriber sendNext:value];
                    return nil;
                }];
            }];
        }];

        [[command execute:nil] subscribeNext:^(RACTuple *x) {
            NSLog(@"%@",x);
        }];

этот оператор map неправильный я это знаю, но это например

- (RACSignal *)adaptObjects:(NSArray *)objects {
    return [objects.rac_sequence.signal flattenMap:^RACStream *(id x) {
        return [self adaptObject:x];
    }];
}

- (RACSignal*)adaptObject:(NSDictionary*) x {
    return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {

       // some operations with data here

        [subscriber sendNext:x];

        return nil;
    }];
}

В NSLog я хочу увидеть результат кортежа с двумя массивами: первый - s1, второй - s2, спасибо


person dev.nikolaz    schedule 15.11.2016    source источник


Ответы (1)


Я написал небольшой пример, надеюсь, он вам поможет.

NSArray *a = @[@{@"k1":@"v1"},
               @{@"k2":@"v2"},
               @{@"k3":@"v3"},
               @{@"k4":@"v4"},
               @{@"k5":@"v5"},
               @{@"k6":@"v6"},
               @{@"k7":@"v7"}];

NSArray *b = @[@{@"kk1":@"vv1"},
               @{@"kk2":@"vv2"},
               @{@"kk3":@"vv3"},
               @{@"kk4":@"vv4"},
               @{@"kk5":@"vv5"},
               @{@"kk6":@"vv6"},
               @{@"kk7":@"vv7"}];

- (NSArray<RACSignal *> *)rac_signalsFromArray:(NSArray *)array {
    NSMutableArray<RACSignal *> *signals = [NSMutableArray array];
    for (NSDictionary *dict in array) {
        [signals addObject:[RACSignal return:dict]];
    }
    return signals;
}

NSArray *Asignals = [self rac_signalsFromArray:a];
NSArray *Bsignals = [self rac_signalsFromArray:b];

NSArray *signals = [[NSArray arrayWithArray:Asignals] arrayByAddingObjectsFromArray:Bsignals];

[[RACSignal zip:signals] subscribeNext:^(RACTuple *tuple) {
    // tuple here
}];
person Nikita Ermolenko    schedule 15.11.2016
comment
Да, хороший пример. Я упустил тот факт, что мы можем обернуть любой объект в RACSignal методом return:. Спасибо - person dev.nikolaz; 15.11.2016