iOS中RAC的使用

  • Reactive Cocoa(RAC)是一个支持FRP(函数响应式编程)的框架;详细的就不再多介绍了,直接说说在我们开发中一些RAC的常见用法;

替换代理

场景:一个View中放着一个Button
当我们点击Button的时候,视图控制器如果需要知道这个Button被点击了,一般我们需要写一个代理去通知控制器。
在RAC中我们不需要写代理,我们需要这样做:
[[_redView rac_signalForSelector:@Selector(btnClicked:)]subscribeNext:^(id x){
      NSLog(@"View中的按钮被点击了");
}];
//这样做 是将一个方法转换成信号

KVO

监听一些属性的变化,只要属性改变就会调用,并把改变的值传递给你。
如:
@property(noatomic,assign) int age;

[[self rac_valueForKeyPath:@"age" observer:nil] subscribeNext:^(id x ){
    NSLog(@"%@",x);
}];

//模拟一个事件  触摸屏幕 就让age自增
-(void)touchesBegin:(NSSet<UITouch*>*)touches WithEvent:(UIEvent*)event{
    age++;
}

监听事件

监听一个按钮的点击事件:
[[_btn rac_signalForControlEvents:UIControlEventsTouchUpInside] subscribeNext:^(id x ){
      NSLog(@"点击了按钮");//在其中 我们做以前单独拿出去写的事件方法一样的事情
}];

监听通知

如监听键盘弹出:
[[NSNotificationCenter defaultCenter] rac_addObserverForName: UIKeyboardWillShowNotification  object:nil] subscribeNext:^(id x ){
      NSLog(@"键盘弹出");
}];

监听文本框文字改变

[_textField.rac_textSignal subscribeNext:^(id x){
      NSLog(@"%@",x);//这里的X就是文本框的文字
}];

需要几个地方数据请求都完成以后再刷新界面的需求

RACSignal*signalA = [RACSignal createSignal:^RACDisposable *(id <RACSubscribe>subscriber){
  NSLog(@"数据请求1");
[subscriber sendNext:@"数据请求1请求下来的数据"];
return nil;
}];

RACSignal*signalB = [RACSignal createSignal:^RACDisposable *(id <RACSubscribe>subscriber){
  NSLog(@"数据请求2");
[subscriber sendNext:@"数据请求2请求下来的数据"];
return nil;
}];

//将两个信号组合 如果两个都有信号发出 则执行回调方法 
[self rac_liftSelector:@Selector(updateUI:new:) withSignalFromArray:@[signalA,signalB]];
//在这里需要注意 数组中有几个参数 回调方法里也应该有几个参数!

常用的宏

1.
[_textField.textSignal subscribeNext:^(id x ){
    self.label.text = x;
}];

//把一个对象的某个属性绑定成一个信号,只要发出信号,就会把信号的内容给对象的属性赋值。
上面的三行代码用下面这个宏代替:
RAC(self.label.text) = _textField.rac_textSignal;

其中RAC()括号中  是需要你填写的目标对象的属性;
2.KVO  (快速监听某个对象的某个属性改变)

如:监听当前视图控制器中心点的变化
[RACObserver (self.view,center) subscribeNext:^(id x){

}];

3. Block中使用self 避免循环引用的出现
@weakify(self);//将self转换成弱指针
RACSignal*signalB = [RACSignal createSignal:^RACDisposable *(id <RACSubscribe>subscriber){ 
@strongify(self);//转换成强指针 避免在block中被释放
NSLog(@"%@",self.view);
return nil;}];
4.元组
//快速组装元组
RACTuple*tuple = RACTuplePack(@1,@3);
NSLog(@"%@",tuple);
//快速解析元组
RACTupleUnPack(NSNumber*num1,NSNumber*num2) = tuple;
//宏的参数表示你需要把这个元组解析成什么类型的数据

最近看到一篇写的很详细的:

[http://limboy.me/tech/2013/12/27/reactivecocoa-2.html]

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

推荐阅读更多精彩内容