返回

RACSignal常用方法深入分析(终)

IOS

switchToLatest

switchToLatest方法用于将一个信号转换为一个新的信号,新信号的元素是原始信号发出的最新信号的元素。这意味着,当原始信号发出一个新的信号时,switchToLatest方法就会将新信号转换为一个新的信号,并将新信号的元素发送给订阅者。

switchToLatest方法的语法如下:

- (RACSignal *)switchToLatest;

switchToLatest方法的返回值是一个新的信号,该信号的元素是原始信号发出的最新信号的元素。

switchToLatest方法的示例代码如下:

RACSignal *signalOfSignals = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    RACSignal *signal1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@"Signal 1"];
        [subscriber sendCompleted];
        return nil;
    }];

    RACSignal *signal2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@"Signal 2"];
        [subscriber sendCompleted];
        return nil;
    }];

    [subscriber sendNext:signal1];
    [subscriber sendNext:signal2];
    [subscriber sendCompleted];
    return nil;
}];

RACSignal *signalOfValues = [signalOfSignals switchToLatest];
[signalOfValues subscribeNext:^(id x) {
    NSLog(@"%@", x);
}];

输出:

Signal 1
Signal 2

deliverOn

deliverOn方法用于指定一个调度器,用于在该调度器上发送信号的元素。这意味着,当信号发出一个元素时,deliverOn方法会将该元素发送到指定的调度器上,由调度器负责将该元素发送给订阅者。

deliverOn方法的语法如下:

- (RACSignal *)deliverOn:(RACScheduler *)scheduler;

deliverOn方法的第一个参数是一个调度器,用于在该调度器上发送信号的元素。

deliverOn方法的返回值是一个新的信号,该信号的元素在指定的调度器上发送。

deliverOn方法的示例代码如下:

RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    [subscriber sendNext:@"Signal"];
    [subscriber sendCompleted];
    return nil;
}];

RACSignal *signalOnMainThread = [signal deliverOn:[RACScheduler mainThreadScheduler]];
[signalOnMainThread subscribeNext:^(id x) {
    NSLog(@"%@", x);
}];

输出:

Signal

throttle

throttle方法用于限制信号发出的元素的频率。这意味着,当信号发出一个元素时,throttle方法会检查该元素是否满足指定的条件,如果满足条件,则将该元素发送给订阅者;如果不满足条件,则丢弃该元素。

throttle方法的语法如下:

- (RACSignal *)throttle:(NSTimeInterval)interval;

throttle方法的第一个参数是一个时间间隔,用于指定元素满足条件的间隔。

throttle方法的返回值是一个新的信号,该信号的元素满足指定的条件。

throttle方法的示例代码如下:

RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    [subscriber sendNext:@"Signal 1"];
    [subscriber sendNext:@"Signal 2"];
    [subscriber sendNext:@"Signal 3"];
    [subscriber sendNext:@"Signal 4"];
    [subscriber sendNext:@"Signal 5"];
    [subscriber sendCompleted];
    return nil;
}];

RACSignal *throttledSignal = [signal throttle:1.0];
[throttledSignal subscribeNext:^(id x) {
    NSLog(@"%@", x);
}];

输出:

Signal 1
Signal 3
Signal 5

distinctUntilChanged

distinctUntilChanged方法用于过滤掉连续重复的元素。这意味着,当信号发出一个元素时,distinctUntilChanged方法会检查该元素是否与前一个元素相同,如果相同,则丢弃该元素;如果不相同,则将该元素发送给订阅者。

distinctUntilChanged方法的语法如下:

- (RACSignal *)distinctUntilChanged;

distinctUntilChanged方法的返回值是一个新的信号,该信号的元素与前一个元素不同。

distinctUntilChanged方法的示例代码如下:

RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    [subscriber sendNext:@"Signal 1"];
    [subscriber sendNext:@"Signal 1"];
    [subscriber sendNext:@"Signal 2"];
    [subscriber sendNext:@"Signal 2"];
    [subscriber sendNext:@"Signal 3"];
    [subscriber sendCompleted];
    return nil;
}];

RACSignal *distinctSignal = [signal distinctUntilChanged