热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入解析RAC在iOS开发中的应用与实践

ReactiveCocoa(RAC)是一个支持FRP(函数响应式编程)的框架;详细的就不再多介绍了,直接说说在我们开发中一些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*)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 subscriber){
  NSLog(@"数据请求1");
[subscriber sendNext:@"数据请求1请求下来的数据"];
return nil;
}];

RACSignal*signalB = [RACSignal createSignal:^RACDisposable *(id 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 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]



推荐阅读
  • 优化SQL Server批量数据插入存储过程的实现
    本文介绍了一种改进的SQL Server存储过程,用于生成批量插入语句。该方法不仅提高了性能,还支持单行和多行模式,适用于SQL Server 2005及以上版本。 ... [详细]
  • 主调|大侠_重温C++ ... [详细]
  • 本文详细介绍了如何使用 HTML 和 CSS 对文件上传按钮进行样式美化,使用户界面更加友好和美观。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 本文深入探讨了面向切面编程(AOP)的概念及其在Spring框架中的应用。通过详细解释AOP的核心术语和实现机制,帮助读者理解如何利用AOP提高代码的可维护性和开发效率。 ... [详细]
  • 历经三十年的开发,Mathematica 已成为技术计算领域的标杆,为全球的技术创新者、教育工作者、学生及其他用户提供了一个领先的计算平台。最新版本 Mathematica 12.3.1 增加了多项核心语言、数学计算、可视化和图形处理的新功能。 ... [详细]
  • 使用Powershell Studio快速构建GUI应用程序
    本文介绍了如何利用Powershell Studio创建功能强大的可视化界面。相较于传统的开发工具,Powershell Studio提供了更为简便和高效的开发体验,尤其适合需要快速构建图形用户界面(GUI)的场景。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 本章详细介绍SP框架中的数据操作方法,包括数据查找、记录查询、新增、删除、更新、计数及字段增减等核心功能。通过具体示例和详细解析,帮助开发者更好地理解和使用这些方法。 ... [详细]
  • 深入解析MySQL中的七种JOIN查询
    本文详细介绍了MySQL中常用的七种JOIN查询方法,包括内连接、左外连接、右外连接、全外连接以及排除连接等,并通过实例进行说明。 ... [详细]
  • 本文探讨了在Django项目中,如何在对象详情页面添加前后导航链接,以提升用户体验。文章详细描述了遇到的问题及解决方案。 ... [详细]
  • 本文详细介绍了如何在PHP中删除数组中的指定元素、第一个元素和最后一个元素,并提供了具体的代码示例和相关函数的使用说明。 ... [详细]
  • Java项目分层架构设计与实践
    本文探讨了Java项目中应用分层的最佳实践,不仅介绍了常见的三层架构(Controller、Service、DAO),还深入分析了各层的职责划分及优化建议。通过合理的分层设计,可以提高代码的可维护性、扩展性和团队协作效率。 ... [详细]
  • CSS高级技巧:动态高亮当前页面导航
    本文介绍了如何使用CSS实现网站导航栏中当前页面的高亮显示,提升用户体验。通过为每个页面的body元素添加特定ID,并结合导航项的类名,可以轻松实现这一功能。 ... [详细]
author-avatar
完结那份友谊吧_586
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有