[TOC]
我文章中的所有源码基于 ReactiveCocoa - ReactiveObjC v3.1
编程范式简单分为:
面向对象 面向过程 链式 函数式 响应式
reactiveObjC:编程范式集大成者
此篇文章,先记录 RAC 简单的记录使用的一些方法
试用
通过 KVO 监听 Property
1 | // count 是 self 的 @property |
监听 NSNotification
1 | [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(NSNotification * _Nullable x) { |
监听 Protocol
1 | [[self rac_signalForSelector:@selector(textFieldDidBeginEditing:) fromProtocol:@protocol(UITextFieldDelegate)] subscribeNext:^(RACTuple * _Nullable x) { |
UI 中的使用
监听 button 点击
1 | [[self.button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) { |
监听 textField 的 text
1 | [[self.textField rac_textSignal] subscribeNext:^(NSString * _Nullable x) { |
rac_textSignal
,是 textField 的 property,通过分类添加 set get 以及关联对象完成。
手势
1 | UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init]; |
信号
热冷信号
以上的所有的 signal,都是信号。
冷热需要分区请求清楚,所以有三篇经典文章。
冷热信号不展开讲了,一定要看美团移动的三篇文章,相当劲爆:
- 细说ReactiveCocoa的冷信号与热信号(一)
- 细说ReactiveCocoa的冷信号与热信号(二):为什么要区分冷热信号
- 细说ReactiveCocoa的冷信号与热信号(三):怎么处理冷信号与热信号
集合类型
序列 RACArraySequence
RACArraySequence
1 | // 序列 sequence |
元组 RACTuple
1 | NSDictionary *dic = @{@"key1": @1, |
高阶函数
所有的高教函数:
- 信号映射:
map
flattenMap
- 信号过滤:
filter
ignore
distinctUntilChanged
- 信号合并:
combineLatest
reduce
merge
zipWith
- 信号连接:
concat
then
- 信号操作时间:
timeout
interval
delay
- 信号取值:
take
takeLast
takeUntil
- 信号跳过:
skip
- 信号发送顺序:
doNext
doCompleted
- 获取信号中的信号:
switchToLatest
- 信号错误重试:
retry
flattenMap
1 | [[ary.rac_sequence.signal flattenMap:^__kindof RACSignal * _Nullable(id _Nullable value) { |
filter
1 | [[[self.textField rac_textSignal] filter:^BOOL(NSString * _Nullable value) { |
combine
1 | RACSignal *s1 = self.textField.rac_textSignal; |
reduce
1 | [[[self.textField.rac_textSignal combineLatestWith:[self.button rac_signalForControlEvents:UIControlEventTouchUpInside]] reduceEach:^id (id a, id b) { |
- Post link: http://yangzai360.top/2020/11/28/RAC_01_Starter/
- Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.