加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

图解ReactiveCocoa基本函数

发布时间:2020-12-15 08:24:58 所属栏目:百科 来源:网络整理
导读:本文讨论仅限于ReactiveCocoa v2.5 关于函数响应式编程(FRP),可以参考 What is (functional) reactive programming? Specification for a Functional Reactive Programming language Streams of values over time ReactiveCocoa repo上最简单的一句话对FR

本文讨论仅限于ReactiveCocoa v2.5


关于函数响应式编程(FRP),可以参考

  • What is (functional) reactive programming?
  • Specification for a Functional Reactive Programming language

Streams of values over time

ReactiveCocoa repo上最简单的一句话对FRP做了本质的描述,而repo本身提供的是APIs of composing and transforming streams of values,而Streams of values的抽象在ReactiveCocoa中应该是RACStream,而要composing and transforming是本文想要描述的核心内容。

先解释ReactiveCocoa中的两个基本概念

  • 信号(Signal) a signal is a steam of values,signals can be transformed,combined,etc.

  • 订阅者(Subscriber) a subscriber subscribes to a signal. RAC lets blocks,objects,and properties subscribe to signals

filter

RACSignal *signal = [@[ @1,@2,@3 ] rac_sequence].signal; signal = [signal filter:^BOOL(NSNumber *value) {
    return value.integerValue % 2;
}];
[signal subscribeNext:^(NSNumber *value) {
    NSLog(@"%@",value);
}];

map

RACSignal *signal1 = [@[ @1,@2 ] rac_sequence].signal;
RACSignal *signal2 = [@[ @4,@5 ] rac_sequence].signal;

[[signal1 merge:signal2] subscribeNext:^(NSNumber *value) {
    NSLog(@"%@",value); }];

merge

RACSignal *signal1 = [@[ @1,value); }];

combineLatest

RACSignal *signal1 = [@[ @1,@2 ] rac_sequence].signal;
RACSignal *signal2 = [@[ @3,@4 ] rac_sequence].signal;

[[signal1 combineLatestWith:signal2] subscribeNext:^(NSNumber *value) {
    NSLog(@"%@",value); }];

combineLatest & reduce

RACSignal *signal1 = [@[ @1,@4 ] rac_sequence].signal;

[[[signal1 combineLatestWith:signal2]
  reduceEach:^id(NSNumber *v1,NSNumber *v2) {
    return @(v1.integerValue * v2.integerValue);
  }] subscribeNext:^(NSNumber *value) {
    NSLog(@"%@",value); }];

flatten

RACSignal *signal1 = [@[ @1,@2 ] rac_sequence].signal;
RACSignal *signal2 = [RACSignal return:signal1];

[[signal2 flatten] subscribeNext:^(NSNumber *value) {
    NSLog(@"%@",value); }];

flattenMap

RACSignal *signal = [@[ @1,@2 ] rac_sequence].signal;

[[signal flattenMap:^RACStream *(NSNumber *value) {
    return [RACSignal return:@(value.integerValue * 2)];
}] subscribeNext:^(NSNumber *value) {
    NSLog(@"%@",value);
}];

not replay

RACSubject *letters = [RACSubject subject];
RACSignal *signal = letters;
[signal subscribeNext:^(id x) {
    NSLog(@"S1: %@",x);
}];
[letters sendNext:@"A"];
[letters sendNext:@"B"];
[signal subscribeNext:^(id x) {
    NSLog(@"S2: %@",x);
}];
[letters sendNext:@"C"];

replay

RACSubject *letters = [RACReplaySubject subject];
RACSignal *signal = letters;
[signal subscribeNext:^(id x) {
  NSLog(@"S1: %@",x);
}];
[letters sendNext:@"A"];
[signal subscribeNext:^(id x) {
  NSLog(@"S2: %@",x);
}];
[letters sendNext:@"B"];
[signal subscribeNext:^(id x) {
  NSLog(@"S3: %@",x);
}];
[letters sendNext:@"C"];

replayLast

RACSubject *letters = [RACSubject subject];
RACSignal *signal = [letters replayLast];
[signal subscribeNext:^(id x) {
  NSLog(@"S1: %@",x);
}];
[letters sendNext:@"C"];

replayLazily

RACSubject *letters = [RACSubject subject];
RACSignal *signal = [letters replayLazily];
[letters sendNext:@"A"];
[signal subscribeNext:^(id x) {
  NSLog(@"S1: %@",x);
}];
[letters sendNext:@"B"];
[signal subscribeNext:^(id x) {
  NSLog(@"S2: %@",x);
}];
[letters sendNext:@"C"];
[signal subscribeNext:^(id x) {
  NSLog(@"S3: %@",x);
}];
[letters sendNext:@"D"];

zip

RACSubject *letters = [RACSubject subject];
RACSubject *numbers = [RACSubject subject];

RACSignal *combined =
    [RACSignal zip:@[ letters,numbers ]
            reduce:^(NSString *letter,NSString *number) {
              return [letter stringByAppendingString:number];
            }];

// Outputs: A1 B2 C3
[combined subscribeNext:^(id x) {
  NSLog(@"%@",x);
}];

[letters sendNext:@"A"];
[letters sendNext:@"B"];
[letters sendNext:@"C"];
[numbers sendNext:@"1"];
[numbers sendNext:@"2"];
[numbers sendNext:@"3"];

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读