Reactive Cocoa 响应式编程开发实例讲解-上篇


至于什么是 Reactive Cocoa(简称RAC),这里我就不多说了(大家可以去渡娘、狗狗),只要记住用来监听-响应的。什么,监听-响应都不知道,举个例子来说:


1.举例子


姓名:___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);
    }];

这段代码一出,好多小伙伴坐不住了,这个RAC 、 RACSignal、combileLatest 上面意思啊?小伙伴别急。先说说思想:

大家记着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,如果多个你是不是需要他们放在一起?


2.概念、常用类解释


   Signal and Subscriber  信号量和订阅者

   刚才已经说过了他们之间关系 signal需要创建,创建完了,如果没人订阅,信号还有什么意义,对吧,红绿灯设计需要人家看,如果人家都不看,那红绿灯没意义的,这是我们称作冷信号,那肯定有热信号,需要大家看订阅,那订阅者根据信号处理事情,这时信号才有意义,所以我们称作热信号。

  打开你的xcode创建一个项目输入:

RACSignal *signal = [RACSignal createSignal:^ RACDisposable * (id<RACSubscriber> subscriber) { 
    NSLog(@"triggered"); 
    //[subscriber sendNext:@"foobar1"];  <pre name="code" class="html" style="color: rgb(51, 51, 51); line-height: 25px;">    //[subscriber sendNext:@"foobar2"];
//[subscriber sendCompleted]; return nil; }];

 

运行一下项目看看有什么变化,你发想什么都没有打印,这就是一个冷信号,只是创建了。需要大家订阅:

    [signal subscribeNext:^(id x) {
        NSLog(@"subscription-%@",x);
    }];

到这里可以运行一下,记着打断点。记着把上面的上面创建信号时的注释各自打开,之后运行后在依次打开,猜猜sendnext是什么意思,在去根据自己的理解想想。

@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;
    }];

    这个宏为什么这么吊,前面加@,其实就是一个啥都没干的@autoreleasepool {}前面的那个@,为了显眼罢了。
    这两个宏一定成对出现,先weak再strong

先到这,后面在讲解......


转载请注源。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值