Context
反复接触 ReactiveCocoa
,这次真的准备把它应用到实际开发中了.为了以后使用方便,这里列出一些常用关键字的使用方法,以备查询.
常用方法
简单订阅 subscribeNext
使用场景:
“ 如果你改变了,让我知道 “
1 | [self.usernameTextField.rac_textSignal subscribeNext:^(id x) { |
过滤条件 filter
使用场景:
“ 如果你改变了,并且满足x条件, 那么再让我知道 “
1 | [[self.usernameTextField.rac_textSignal |
还有拆分的写法,因为 block层级太深 ,可读性不好:
1 | RACSignal* usernameSourceSignal = self.usernameTextField.rac_textSignal; |
类型转换 map
使用场景:
当需要从输入信号中提取不同的信息时(比如这里, 从打印下个字符,到打印长度)
1 | [[[self.usernameTextField.rac_textSignal |
- 注意: 可 map 的只能是对象
RAC 宏
使用场景: RAC(A,b)
利用信号改变 A 的 b 属性值
1 | // 验证信号 |
聚合信号 combineLatest
使用场景:
多个信号条件同时满足, 才能产生有效信号(比如登陆的时候,用户名有效并且密码有效的时候,登陆按钮才应该有效)
1 | RACSignal *signUpActiveSignal = |
- 使用combineLatest:reduce:方法把validUsernameSignal和validPasswordSignal产生的最新的值聚合在一起,并生成一个新的信号。每次这两个源信号的任何一个产生新值时,reduce block都会执行,block的返回值会发给下一个信号。
事件信号
使用场景:
拿到UIKit控件的事件响应信号
1 | [[self.signInButton |
封装方法
使用场景:
想把一个异步的API 封装成信号
1 | - (RACSignal *)signInSignal { |
拿到信号中的信号 flattenMap
使用场景:
当需要从包含信号b的信号a中拿取信号b
1 | [[[self.signInButton |
添加附加操作(Adding side-effects)
使用场景:
需要进行一些准备工作的时候
1 | [[[[self.signInButton |
移除订阅 dispose
使用场景:
当需要手动释放一个信号(当没有订阅,信号就不复存在),但是使用场景很少,仅供了解
1 | RACSignal *backgroundColorSignal = |
防止循环引用
1 | @weakify(self) |
next error completed
在signal的生命周期中,它可能不发送事件,发送一个或多个next事
件,在这之后还能发送一个completed事件或一个error事件。
1 | [[self requestAccessToTwitterSignal] |
信号链接 then
使用场景:
当后面的信号需要依赖前面的信号时
1 | [[[self requestAccessToTwitterSignal] |
then方法会等待completed事件的发送,然后再订阅由then block返回的signal。这样就高效地把控制权从一个signal传递给下一个。
then方法会跳过error事件,因此最终的subscribeNext:error: block还是会收到获取访问权限那一步发送的error事件。
异步信号
使用场景:
后台加载资源
1 | -(RACSignal *)signalForLoadingImage:(NSString *)imageUrl { |
- subscribeOn:来确保signal在指定的scheduler上执行。
在主线程上更新UI
1 | cell.twitterAvatarView.image = nil; |
针对cell的重用问题, 有种更优化的方法:
1 | [[[[self signalForLoadingImage:tweet.profileImageUrl] |
延时响应 throttle
使用场景:
当用户输入完毕, 自定进行搜索的时候,不应该用户每次改变输入,都马上搜索,应该当用户停止输入 x 秒之后,再进行搜索
1 | @weakify(self); |
参考网址:
http://www.raywenderlich.com/62699/reactivecocoa-tutorial-pt1
http://benbeng.leanote.com/post/ReactiveCocoaTutorial-part1