RACSequence analysis (7) - RACSignalSequence

As a subclass of RACSequence, RACSignalSequence provides a method to initialize a RACSequence through RACSignal.

Complete test case Ad locum.

See the method in. m:

+ (RACSequence *)sequenceWithSignal:(RACSignal *)signal {
    RACSignalSequence *seq = [[self alloc] init];

    RACReplaySubject *subject = [RACReplaySubject subject];
    [signal subscribeNext:^(id value) {
        [subject sendNext:value];
    } error:^(NSError *error) {
        [subject sendError:error];
    } completed:^{
        [subject sendCompleted];
    }];

    seq->_subject = subject;
    return seq;
}

Method, initialize the RACSignalSequence RACReplaySubject object, and complete the subscription to the parameter signal. At this time, save the signal information through the RACReplaySubject. Therefore, all information of signal can be obtained through seq.

Test case:

- (void)test_sequenceWithSignal
{
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {

        [subscriber sendNext:@"1"];
        [subscriber sendCompleted];

        return nil;
    }];

    RACSequence *sequence = [RACSignalSequence sequenceWithSignal:signal];

    NSLog(@"sequenceWithSignal -- %@", sequence);

    // Print log:
    /*
     2018-08-17 17:08:33.093062+0800 TestRACSignalSequence[50146:18295650] sequenceWithSignal -- <RACSignalSequence: 0x60400023fe80>{ name = , values = (
     1
     ) ... }
     */
}
- (id)head {
    id value = [self.subject firstOrDefault:self];

    if (value == self) {
        return nil;
    } else {
        return value ?: NSNull.null;
    }
}

Get the first value of the subject as the head value through firstOrDefault:.

Test case:

- (void)test_head
{
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {

        [subscriber sendNext:@"1"];
        [subscriber sendCompleted];

        return nil;
    }];

    RACSequence *sequence = [RACSignalSequence sequenceWithSignal:signal];

    NSLog(@"head -- %@", sequence.head);

    // Print log:
    /*
     2018-08-17 17:10:39.537477+0800 TestRACSignalSequence[50245:18302711] head -- 1
     */
}
- (RACSequence *)tail {
    RACSequence *sequence = [self.class sequenceWithSignal:[self.subject skip:1]];
    sequence.name = self.name;
    return sequence;
}

Get the signal after removing the first value through skip:1, and generate a RACSequence object as the tail value through sequenceWithSignal:.

Test case:

- (void)test_tail
{
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {

        [subscriber sendNext:@"1"];
        [subscriber sendNext:@"2"];
        [subscriber sendCompleted];

        return nil;
    }];

    RACSequence *sequence = [RACSignalSequence sequenceWithSignal:signal];

    NSLog(@"tail -- %@", sequence.tail);

    // Print log:
    /*
     2018-08-17 17:12:54.839794+0800 TestRACSignalSequence[50350:18310055] tail -- <RACSignalSequence: 0x60400023c820>{ name = , values = (
     2
     ) ... }
     */
}
- (NSArray *)array {
    return self.subject.toArray;
}

Get the array of signal values through toArray.

Test case:

- (void)test_array
{
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {

        [subscriber sendNext:@"1"];
        [subscriber sendNext:@"2"];
        [subscriber sendCompleted];

        return nil;
    }];

    RACSequence *sequence = [RACSignalSequence sequenceWithSignal:signal];

    NSLog(@"array -- %@", sequence.array);

    // Print log:
    /*
     2018-08-17 17:17:30.637284+0800 TestRACSignalSequence[50521:18323552] array -- (
     1,
     2
     )
     */
}

The format log method is no longer parsed.

Therefore, the function of this class is to convert a signal into a sequence, and obtain the value of the signal through the sequence method.

Posted by bravo14 on Thu, 02 Jan 2020 12:24:10 -0800