zoukankan      html  css  js  c++  java
  • Reactivecocoa初级使用

    一直听闻ReactiveCocoa(以下简称RAC)的大名,但始终没有使用。最近时间比较空闲就决定研究一下。

    在配置RAC时候遇到了一个小麻烦需要说明本人用cocoapods管理第三方框架,于是按照正常流程在终端中

    输入pod search ReactiveCocoa,找到搜索结果

    于是vim 打开Podfile 录入

    pod 'ReactiveCocoa', '~> 3.0.0-alpha.1'

    结果cocoapods始终安装不了 原因竟是3.0.0支持的是swift

    于是重新录入pod 'ReactiveCocoa' 就能安装成功并使用了

    RAC:响应式编程,使用的过程紧记一个词语Signal(信号),个人感觉RAC主要就是用信号来进行管理和操作

    下面来讲解一些基本的使用方法

    1.文本框普通监听,创建有usename的一个文本框

    1     //对象.rac_textSignal返回RACSignal对象(理解为rac信号)
    2     //每次next事件发生时,subscribeNext:方法提供的block都会执行。
    3     //因为对象类型已定(如此处为UITextFeild),所以形参中的属性可以转化成对应属性
    4     [self.usename.rac_textSignal subscribeNext:^(id x) {
    5         NSLog(@"first = %@",x);
    6     }];

    在文本框内录入abcd时得到打印结果如下

    此处可以看到有多余的2个空字符串,第一行我理解为被创建的时候调用了一次block方法,第二行为成为第一响应者时调用的

    由录入可以看出每当文本框有所事件时,都会调用next(下一步)方法中的block。

    这样有前两个空白的明显不是我们所想要的效果,于是RAC里面就设计了filter(过滤器)来进行判定

    1     //filter(过滤器)用于限定subscribeNext执行条件
    2     [[self.usename.rac_textSignal filter:^BOOL(id value) {
    3         NSString *text = value;
    4         return text.length >0;
    5     }] subscribeNext:^(id x) {
    6         NSLog(@"second = %@",x);
    7     }];

    此时我们再按照上面方式录入abcd后得到打印结果

    此时就得出我们想要得到的结果,但是这样看来限定条件看来只能是字符串(value)本身吗?

    其实RAC还给我们提供了一个map(转换)来改变value的类别,例如

     1     //设置map后 filter中的value为 map块中return的对象
     2     [[[self.usename.rac_textSignal map:^id(NSString *value) {
     3         NSLog(@"map ===%@",value);
     4         return @(value.length);
     5     }] filter:^BOOL(id value) {
     6         NSLog(@"filter ===%@",value);
     7         return [value integerValue] > 0;
     8     }] subscribeNext:^(id x) {
     9         NSLog(@"输出成功");
    10     }];

    此时我们同样录入abcd后得到打印结果

    由此可以看出filter的类型变为了NSnumber类型,以上便是三个RAC使用最基本的知识点 map(转化) filter(过滤) next(下一步)

    2.Button点击事件

    平常设置button点击事件的时候还需要设置另外一个方法,在RAC中则可以不用这儿做

     1 #pragma mark 按钮普通设置方式
     2     [[self.enterButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
     3         NSLog(@"信号1:被点击了%@",x);
     4     }];
     5     [[self.enterButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
     6         NSLog(@"信号2:被点击了%@",x);
     7     }];
     8 #pragma mark 按钮第二种设置方式
     9     //点击代理事件,会使按钮可enabled一直为YES
    10     self.enterButton.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(UIButton *input) {
    11         if ([self.password.text isEqualToString:@"111"] && [self.usename.text isEqualToString:@"bai"]) {
    12             NSLog(@"正确");
    13             [[NSNotificationCenter defaultCenter] postNotificationName:@"isLogin" object:nil];
    14         }else{
    15             NSLog(@"错误");
    16         }
    17         self.name = [self.usename.text mutableCopy];
    18         return [RACSignal empty];
    19     }];

    当我点击按钮后得到打印结果如下

    这样就完成了button按钮点击的回调,在此处结果可以看出一个控件是可以创建多个signal(信号)

    3.信号合并

     1     //rac_textSignal 或者map:都会返回一个RACSigna类型的信号
     2     RACSignal *usename = [self.usename.rac_textSignal map:^id(id value) {
     3         NSString *text = value;
     4         return @(text.length);
     5     }];
     6     RACSignal *password = [self.password.rac_textSignal map:^id(id value) {
     7         NSString *text = value;
     8         return @(text.length);
     9     }];
    10     //将usename同password信号合并创建新的haveTextSignal信号。combneLatest:(需要合并的信号数组)reduce:(对应信号的value)
    11     RACSignal *haveTextSignal = [RACSignal combineLatest:@[usename,password] reduce:^id(NSNumber *usename,NSNumber *password){
    12         return @([usename boolValue] && [password boolValue]);
    13     }];
    14     //设定haveTextSignal信号来控制按钮是否可以被点击
    15     [haveTextSignal subscribeNext:^(id x) {
    16         NSNumber *num = x;
    17         self.enterButton.enabled = [num boolValue];
    18     }];

    此时的结果是当文本框都没有值时登录按钮不能被点击,都有值才能点击登录按钮(截图不规范,只为展示)

    4.kvo和通知的RAC使用

    由于kvo和通知的用法较为简单这边直接上代码

     1  /*   
     2  其中block会对其中对象进行强引用,为防止循环引用其中的全局对象最好采用弱引用类型 
     3  RAC语法 block外部@weakify(self) block内部@strongify(self)
     4  接着可直接在block内部使用self
     5 */ 
     6     //kvo       
     7     @weakify(self)
     8     RAC(self.usename,backgroundColor) = [self.usename.rac_textSignal map:^id(id value) {
     9         @strongify(self)
    10         return self.usename.text.length > 2 ? [UIColor orangeColor] : [UIColor clearColor];
    11     }];
    12 
    13     //Notification方法
    14     [[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"isLogin" object:nil] subscribeNext:^(id x) {
    15         NSLog(@"成功登陆");
    16     }];

    到此RAC的基本使用方法就介绍完毕,当然RAC框架的内容远远不止这些,单个人觉得这些属于比较实用部分,就只研究了这一部分。

    如果以后还有RAC的研究会在此基础上增加。

  • 相关阅读:
    Day01
    微前端技术框架qiankun技术分享
    终于有人把O2O、C2C、B2B、B2C的区别讲透了
    Electron-Vue项目使用Element的el-table组件不显示
    monaco editor各种功能实现总结
    electron-vue项目使用elementUI组件报错$attrs is readonly
    monaco-editor 使用总结
    闲谈Monaco Editor-基本使用
    【软件】MATHTYPE破解记
    C# EF
  • 原文地址:https://www.cnblogs.com/purple-sweet-pottoes/p/4725827.html
Copyright © 2011-2022 走看看