RACSignal的使用基础

获得信号的方式

  • 单元信号

    RACSignal *signal1 = [RACSignal return:@"Some Value"];
    RACSignal *signal2 = [RACSignal error:errorObject];
    RACSignal *signal3 = [RACSignal empty];
    RACSignal *signal4 = [RACSignal never];
    
  • 动态信号

        RACSignal *signal5 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            [subscriber sendNext:@1];
            [subscriber sendNext:@2];
            [subscriber sendError:errorObject];
            [subscriber sendCompleted];
            return [RACDisposable disposableWithBlock:^{
                
            }];
        }];
    
  • Cocoa桥接

        RACSignal *signal6 = [view rac_signalForSelector:@selector(setFrame:)];
        RACSignal *signal7 = [view rac_signalForControlEvents:UIControlEventTouchUpInside];
        RACSignal *signal8 = [view rac_willDeallocSignal];
        RACSignal *signal9 = RACObserve(view, backgroundColor);
    
  • 信号转换

        RACSignal *signal10 = [signal1 map:^id _Nullable(NSString *  _Nullable value) {
            return [value substringFromIndex:1];
        }];
    
  • 序列转换

        RACSignal *signal11 = sequence.signal;
    

订阅一个信号的方式

  • 订阅方法

      [signal11 subscribeNext:^(id  _Nullable x) {
            NSLog(@"next value is %@", x);
        } error:^(NSError * _Nullable error) {
            NSLog(@"ops! Get some error: %@", error);
        } completed:^{
            NSLog(@"finish success");
        }];
    
  • 绑定

      RAC(view,backgroundColor) = signal10;
    
  • Cocoa桥接

         [view rac_liftSelector:@selector(convertPoint:toView:) withSignals:signal1,signal2, nil];
        [view rac_liftSelector:@selector(convertPoint:toView:) withSignalsFromArray:@[signal1,signal2]];
        [view rac_liftSelector:@selector(convertRect:toLayer:) withSignalOfArguments:signal5];
    

订阅过程

 RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        [subscriber sendNext:@1];
        [subscriber sendNext:@2];
        [subscriber sendCompleted];
        return [RACDisposable disposableWithBlock:^{
            NSLog(@"disposed");
        }];
    }];
    
    RACDisposable *disposable = [signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"next value is %@", x);
    } error:^(NSError * _Nullable error) {
        NSLog(@"Ops! Get some error:%@", error);
    } completed:^{
        NSLog(@"It finished");
    }];
    
    [disposable dispose];

元祖-RACTuple

  • RAC定义的一种数据类型
  • NSArray的简化版
  • 其他语言中的意义
  • 使用
  RACTuple *tuple = RACTuplePack(@1, @"second");
    
    id first = tuple.first;
    id second = tuple.second;
    id last = tuple.last;
    
    id index2 = tuple[1];//second
    NSLog(@"%@", index2);
    
    RACTupleUnpack(NSNumber *num, NSString *str) = tuple;
    NSLog(@"num is %@", num); //num is 1
}

信号示例

信号示例.png

信号定义&&信号订阅

信号订阅与定义.png

单元信号图示

单元信号.png

信号的变换和组合

信号的变换.png
信号的组合.png

单个信号的变换

单个信号的变换.png

对值操作

Map
map.png
MapReplace
map_replace.png
ReduceEach(只用于元祖)
reduce_each.png
其他
其他.png

对数量操作

Filter(减少数量)
filter.png
ignore(减少数量)
ignore.png
take(减少数量)
take.png
skip(减少数量)
skip.png
take&skip其他(减少数量)
take_skip.png
混合操作(减少数量)
混合操作.png
StartWith(增加数量)
start_with.png
Repeat(增加数量)
repeat.png
retry
retry.png
副作用操作
副作用操作.png
数量操作-collect
collect.png
数量操作-aggregate
aggregate.png
数量操作-scan
scan.png
aggregate && scan变种
agg_scan.png

时间操作-有用的信号

time_signal.png

时间操作-Delay

delay.png

时间操作-Throttle

throttle.png

时间操作-类似Throttle的方法

buffer.png

多个信号组合

  • 受那个信号终止而终止?
  • 错误传递
  • 各个信号何时开始订阅?
concat
concat.png
merge
merge.png
merger运用.png
组合操作--zip
zip.png

组合操作-combineLatest

combine_latest.png
组合操作- Zip&CombineLatest
zip_combinelatest.png
组合操作 - Sample
sample.png
组合操作--TakeUntil
take_until.png
组合操作--TakeUntilReplacement
take_until_replace.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。