图解 ReactiveCocoa 基本函数
发布日期:2021-08-25 15:35:11 浏览次数:13 分类:技术文章

本文共 4149 字,大约阅读时间需要 13 分钟。

2016-10-10 | 稻子| iOS

标签(空格分隔): RAC FRP 函数式编程 响应式编程

本文内容仅适用于


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

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 *signal = [@[ @1, @2, @3 ] rac_sequence].signal;  signal = [signal map:^id(NSNumber *value) {    return @(value.integerValue * 2);  }];  [signal subscribeNext:^(NSNumber *value) {    NSLog(@"%@", value);  }];复制代码

merge

RACSignal *signal1 = [@[ @1, @2 ] rac_sequence].signal;RACSignal *signal2 = [@[ @4, @5 ] rac_sequence].signal;[[signal1 merge:signal2] subscribeNext:^(NSNumber *value) {    NSLog(@"%@", value);}];复制代码

combineLatest

RACSignal *signal1 = [@[ @1, @2 ] rac_sequence].signal;  RACSignal *signal2 = [@[ @3, @4 ] rac_sequence].signal;  [[signal1 combineLatestWith:signal2] subscribeNext:^(RACTuple *value) {    NSLog(@"%@", value);  }];复制代码

combineLatest & reduce

RACSignal *signal1 = [@[ @1, @2 ] rac_sequence].signal;  RACSignal *signal2 = [@[ @3, @4 ] rac_sequence].signal;  [[[signal1 combineLatestWith:signal2]      reduceEach:^id(NSNumber *v1, NSNumber *v2) {        return @(v1.integerValue * v2.integerValue);      }] subscribeNext:^(RACTuple *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"];[signal subscribeNext:^(id x) {    NSLog(@"S2: %@", x);}];[letters sendNext:@"B"];[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:@"A"];[signal subscribeNext:^(id x) {  NSLog(@"S2: %@", x);}];[letters sendNext:@"B"];[signal subscribeNext:^(id x) {  NSLog(@"S3: %@", 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"];复制代码

完整的源码可以在这里找到

"-g"选项 : 查看日志缓冲区信息;"-b"选项 : 加载一个日志缓冲区, 默认是 main, 下面详解;"-B"选项 : 以二进制形式输出日志;复制代码

如有任何知识产权、版权问题或理论错误,还请指正。

转载请注明原作者及以上信息。

转载地址:https://blog.csdn.net/weixin_33858336/article/details/87983946 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:多线程知识梳理(1) 并发编程的艺术笔记
下一篇:A dirty way of tricking users to bypass UAC

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年03月24日 15时09分56秒