至于什么是 Reactive Cocoa(简称RAC),这里我就不多说了(大家可以去渡娘、狗狗),只要记住用来监听-响应的。什么,监听-响应都不知道,举个例子来说:
姓名:___textField__________ (*模拟的一个Textfild,大家将就看)
---------------------
| 提交按钮 | (这是按个按钮)
---------------------
我就认为小伙伴知道我的意思了:开始的时候TextField是空白,需要输入你的姓名,而此时提交按钮时灰色表示不能点击。
这里有个需求:如果textfield里面有人输入一个姓名,此时提交按钮自动编程高亮可以点击,如果有人再把姓名删掉变成空,此时按钮变成灰色不能点击。
这是小伙伴会想在上面的textfiled的textchange事件里面写或者用timer触发器或者用KVO什么的,当然这些都可以解决上面的问题。现在说说RAC,RAC是把这些功能都封装,还提供很强大的功能(先不说这些功能怎么用,等你用了,你发现我的解释不一定符合你的理解),实现上面的功能是个很小的case。
RAC(self.ui_btn,enabled) = [RACSignal combineLatest:@[self.ui_testText.rac_textSignal] reduce:^(NSString *username){
return @(username.length > 0);
}];
大家记着notification的用法吗?有个消息中心,如果想处理某个消息,是否要addObserve什么的,其实这个也差不多。RACSignal是一个消息,不过他们称作是信号量,名字不一样啦,信号产生需要人家去看,如果没有人看,这个信号就没有意义了,这个看,他们称作订阅。
我们解释一下代码:
RAC(self.ui_btn,enable)这个猜也猜出来,所以小伙伴要大胆猜,肯定self.ui_btn.enable = 但是要符合RAC机制所以加了个壳,后面 一大串,不用说你也猜出来了,用来解决监听ui_testText.text (UITextField控件),reduce 就是返回结果,username参数就是field的text,判断是否大于0(是否空),返回一个对象@(),赋值到enable上面。
有的小伙伴问能用self.ui_testText.text.length>0吗,当然能。但是如果加了一个self 和block一起使用大家猜猜会产生什么 相互retain。所以RAC里面给出了一套解决办法,@weakify和@strongify (成对出现)。
有的小伙伴又问为什么用combineLatest,这个叫做信号量的组合,你想想开发中肯定不止一个textfield,如果多个你是不是需要他们放在一起?
Signal and Subscriber 信号量和订阅者
刚才已经说过了他们之间关系 signal需要创建,创建完了,如果没人订阅,信号还有什么意义,对吧,红绿灯设计需要人家看,如果人家都不看,那红绿灯没意义的,这是我们称作冷信号,那肯定有热信号,需要大家看订阅,那订阅者根据信号处理事情,这时信号才有意义,所以我们称作热信号。
打开你的xcode创建一个项目输入:
RACSignal *signal = [RACSignal createSignal:^ RACDisposable * (id subscriber) {
NSLog(@"triggered");
//[subscriber sendNext:@"foobar1"]; //[subscriber sendNext:@"foobar2"];
//[subscriber sendCompleted]; return nil; }];
[signal subscribeNext:^(id x) {
NSLog(@"subscription-%@",x);
}];
@weakify(Obj) @strongify(Obj)
这对宏在 RACEXTScope.h 中定义,RACFramework好像没有默认引入,需要单独import
他们的作用主要是在block内部管理对self的引用:
@weakify(self); // 定义了一个__weak的self_weak_变量
[RACObserve(self, name) subscribeNext:^(NSString *name) {
@strongify(self); // 局域定义了一个__strong的self指针指向self_weak self.outputLabel.text = name;
}];
先到这,后面在讲解......
转载请注源。