ReactiveCocoa基本用法(适合初学者)持续更新...

github文章链接

文章前言

一般在使用一个框架之前需要了解的事情,也就是需要了解的东西,本人总结了一下有下面几点(比较浅显,欢迎喷口水):

1. 这个框架有什么用,即这个框架能够给我带来什么作用
2. 怎么集成这个框架
3. 框架的使用方法

下面就从这几个点展开


一、这个框架有什么用,即这个框架能够给我带来什么作用

  • 在我们iOS开发过程中,当某些事件响应的时候,需要处理某些业务逻辑,这些事件都用不同的方式来处理。
  • 比如按钮的点击使用action,使用delegate,属性值改变使用KVO,通知等系统提供的方式。都可以通过RAC处理
  • ReactiveCocoa为事件提供了很多处理方法,而且利用RAC处理事件很方便,可以把要处理的事情,和监听的事情的代码放在一起,这样非常方便我们管理,就不需要跳到对应的方法里。非常符合我们开发中高内聚,低耦合的思想。

二、 怎么集成这个框架(这里只介绍cocoaPods的集成方法)

  • OC版的ReactiveCocoa(下面简称RAC)集成方法
pod 'ReactiveObjC'或者pod 'ReactiveObjC', '~> 指定版本'
  • swift版的ReactiveCocoa集成方法
pod 'ReactiveCocoa'或者pod 'ReactiveCocoa', '~> 指定版本'

相信集成这个框架对于一个iOS开发者来说并不是什么难事,下面就介绍框架的几种常用方法废话不多说直接上代码

三、框架的使用方法

1. RACSignal框架中最常用的一个类
  • RACSiganl:信号类,表示将来有数据传递,只要有数据改变,信号内部接收到数据,就会马上发出数据
  • 默认一个信号都是冷信号,也就是值改变了,也不会触发,只有订阅了这个信号,这个信号才会变为热信号,值改变了才会触发。
  • 如何订阅信号:调用信号RACSignal的subscribeNext就能订阅。
2. RACSignal使用步骤
  • 创建信号
+ (RACSignal *)createSignal:(RACDisposable * (^)(id subscriber))didSubscribe

当然还有其他的创建方法,可以自行尝试

  • 订阅信号,才会激活信号
- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
  • 发送信号
- (void)sendNext:(id)value

这里发送信号的入参value,可以是网络请求的返回值,以及各种你想要传递出去的东西

上代码

//1.创建信号
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id subscriber) {
 
        //保存起来 就不会被取消订阅
        _subscriber = subscriber;
        //3.发送信号
        [subscriber sendNext:@1];
 
        return [RACDisposable disposableWithBlock:^{
            NSLog(@"默认信号发送完毕被取消");
        }];
 
    }];
 
    //如果要取消就拿到 RACDisposable
    //2.订阅信号
    RACDisposable *disposable = [signal subscribeNext:^(id x) {
 
        NSLog(@"%@",x);
    }];
 
    //取消订阅
    [disposable dispose];
}

看过上面的方法,再来看一波网络请求的使用方法

 [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        // 这里进行一个网络请求
        DELAY(1000000000000);
        // 如果请求成功就发送next和complete事件,如果失败就发送error事件
        [subscriber sendNext:@"第一个任务"];
        // 这里记住一定要调用sendCompleted方法,因为不调用完成这个方法,信号就不会销毁,一直占用着内存,这个是开发者们最不希望看到的
        [subscriber sendCompleted];
        //        [subscriber sendError:nil];
        return [RACDisposable disposableWithBlock:^{
            NSLog(@"默认信号发送完毕后就会被销毁,没有订阅者的时候就会被销毁");
        }];
    }];

到这里,我觉得RACSignal信号类的使用方法应该能够掌握了,这里讲解一下代码里用到的一些类和协议

  • RACSubscriber:表示订阅者的意思,用于发送信号,这是一个协议,不是一个类,只要遵守这个协议,并且实现方法才能成为订阅者。通过create创建的信号,都有一个订阅者,帮助他发送数据。
  • RACDisposable:用于取消订阅或者清理资源,当信号发送完成或者发送错误的时候,就会自动触发它。

使用场景:不想监听某个信号时,可以通过它主动取消订阅信号。

3. 回看到文章的开头,RAC的作用第二点

比如按钮的点击使用action,使用delegate,属性值改变使用KVO,通知等系统提供的方式。都可以通过RAC处理

下面就介绍一些常用的用法不仅可以节约开发时间,而且可以使逻辑代码更加的集中,举个例子:给按钮添加一个target,首先需要addtarget,然后需要写一个方法实现,其实系统的也不麻烦,但是RAC给我们提供了更加快捷的方案,请看表演:

/**
 按钮的点击事件
 */
- (void)addButtonTarget {
    UIButton *loginButton = [[UIButton alloc] init];
    loginButton.backgroundColor = [UIColor grayColor];
    loginButton.frame = CGRectMake(150, 220, 100, 100);
    [self.view addSubview:loginButton];
    
    [[loginButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
        NSLog(@"%@", x);
    }];
}

想必看到这里大家应该能够看到快捷的地方了,不用添加target,不用再定义一个方法!这个解释一下代码

  • rac_signalForControlEvents这个方法的返回值其实是一个信号类,即RACSignal类,再会看到上面提到的RACSignal的使用方法,先创建信号,其实这里内部就会创建一个信号并且返回
  • subscribeNext这里就是订阅信号了
  • 最后发送信号,你可以在subscribeNext的block里面看到,里面的参数,其实就是点击按钮传递出来的值,可以理解为信号携带的值

这里再举一个例子:监听文本输入框事件。相信大家在开发中经常会遇到需要监听文本框,以此来对付产品提出的各种逆天并且领先科技N年的想法,通常做法都是addtarget,或者delegate,实现各种代理方法,这里使用RAC可以达到异曲同工的效果,上代码:

/**
 监听文本框的输入
 */
- (void)textFieldChange {
    UITextField *textFidle = [[UITextField alloc] init];
    textFidle.frame = CGRectMake(100, 100, 200, 40);
    textFidle.backgroundColor = [UIColor grayColor];
    [self.view addSubview:textFidle];
    
    // 监听文本框的输入,而且只有大于3个长度的时候才会打印
    [[textFidle.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
        return value.length > 3;
    }]
     subscribeNext:^(NSString * _Nullable x) {
         NSLog(@"%@", x);
     }];
}

这里讲解一下代码

  • textFidle.rac_textSignal这里会返回一个信号,直接订阅该信号就可以拿到输入框里的内容了
  • 这里可以看到有一个新的东西filter,这个可以理解为筛选过滤的意思,需要返回一个bool值,即只有返回YES的时候subscribeNext,这个block才会调用,可以理解为只有给出通行证,才可以继续往下面执行,filter返回的还是一个RACSignal类
后续更新内容
  1. 结合实际开发场景,使用RAC解决输入框,按钮点击联动逻辑
  2. 组合信号的使用方法以及使用场景
  3. 快速解决多个任务需要按照顺序执行的需求
  4. 在开发中经常需要执行多个请求,然后再执行后续的任务(让你不再使用GCD中的任务调度组)
  5. 在开发中共需要按照顺序执行多个请求,帮助你更好的解决问题
  6. 网络请求的封装(RACCommand)
  7. 代理的使用方法

最后感谢所有能够看到末尾的人,如有写的不对的地方可以随时指出,欢迎加群QQ交流:578068845

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,755评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,305评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,138评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,791评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,794评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,631评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,362评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,264评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,724评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,900评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,040评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,742评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,364评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,944评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,060评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,247评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,979评论 2 355

推荐阅读更多精彩内容