- 浏览: 2204147 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1240)
- mac/IOS (287)
- flutter (1)
- J2EE (115)
- android基础知识 (582)
- android中级知识 (55)
- android组件(Widget)开发 (18)
- android 错误 (21)
- javascript (18)
- linux (70)
- 树莓派 (18)
- gwt/gxt (1)
- 工具(IDE)/包(jar) (18)
- web前端 (17)
- java 算法 (8)
- 其它 (5)
- chrome (7)
- 数据库 (8)
- 经济/金融 (0)
- english (2)
- HTML5 (7)
- 网络安全 (14)
- 设计欣赏/设计窗 (8)
- 汇编/C (8)
- 工具类 (4)
- 游戏 (5)
- 开发频道 (5)
- Android OpenGL (1)
- 科学 (4)
- 运维 (0)
- 好东西 (6)
- 美食 (1)
最新评论
-
liangzai_cool:
请教一下,文中,shell、C、Python三种方式控制led ...
树莓派 - MAX7219 -
jiazimo:
...
Kafka源码分析-序列5 -Producer -RecordAccumulator队列分析 -
hp321:
Windows该命令是不是需要安装什么软件才可以?我试过不行( ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
hp321:
Chenzh_758 写道其实直接用一下代码就可以解决了:JP ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
huanghonhpeng:
大哥你真强什么都会,研究研究。。。。小弟在这里学到了很多知识。 ...
android 浏览器
引用
RAC 指的就是 RactiveCocoa ,是 Github 的一个开源框架,能够帮我们提供大量方便的事件处理方案,让我们更简单粗暴地去处理事件,现在分为 ReactiveObjC 和 ReactiveSwift ,两个框架的功能使用相似,项目是用 OC 写的,所以将 ReactiveObjC 的使用方法记录一下。
pod 'ReactiveObjC', '~> 3.0.0'
https://github.com/ReactiveCocoa/ReactiveObjC
1. RACSignal 信号
/* 创建信号 */ RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) { /* 发送信号 */ [subscriber sendNext:@"发送信号"]; return nil; }]; /* 订阅信号 */ RACDisposable *disposable = [signal subscribeNext:^(id _Nullable x) { NSLog(@"信号内容:%@", x); }]; /* 取消订阅 */ [disposable dispose];
2. RACSubject 信号
和代理的用法类似,通常用来代替代理,有了它,就不必要定义代理了。
/* 创建信号 */ RACSubject *subject = [RACSubject subject]; /* 发送信号 */ [subject sendNext:@"发送信号"]; /* 订阅信号(通常在别的视图控制器中订阅,与代理的用法类似) */ [subject subscribeNext:^(id _Nullable x) { NSLog(@"信号内容:%@", x); }];
3. RACTuple 元祖
RAC 的元祖,跟我们 OC 的数组其实是一样的,它其实就是封装了我们 OC 的数组。
/* 创建元祖 */ RACTuple *tuple = [RACTuple tupleWithObjects:@"1", @"2", @"3", @"4", @"5", nil]; /* 从别的数组中获取内容 */ RACTuple *tuple = [RACTuple tupleWithObjectsFromArray:@[@"1", @"2", @"3", @"4", @"5"]]; /* 利用 RAC 宏快速封装 */ RACTuple *tuple = RACTuplePack(@"1", @"2", @"3", @"4", @"5"); NSLog(@"取元祖内容:%@", tuple[0]); NSLog(@"第一个元素:%@", [tuple first]); NSLog(@"最后一个元素:%@", [tuple last]);
4. 便利 Array 数组和 Dictionary 字典
可以省去使用 for 循环来遍历。
/* 遍历数组 */ NSArray *array = @[@"1", @"2", @"3", @"4", @"5"]; [array.rac_sequence.signal subscribeNext:^(id _Nullable x) { NSLog(@"数组内容:%@", x); // x 可以是任何对象 }];
/* 遍历字典 */ NSDictionary *dictionary = @{@"key1":@"value1", @"key2":@"value2", @"key3":@"value3"}; [dictionary.rac_sequence.signal subscribeNext:^(RACTuple * _Nullable x) { RACTupleUnpack(NSString *key, NSString *value) = x; // x 是一个元祖,这个宏能够将 key 和 value 拆开 NSLog(@"字典内容:%@:%@", key, value); }];
下面两个方法都是将数组内容全部换为 0 ,第一个是单个操作,,第二个是一次性全部替换,两个方法都不会改变原数组内容,操作完后都会生成一个新的数组,省去了创建可变数组然后遍历出来单个添加的步骤。
/* 内容操作 */ NSArray *array = @[@"1", @"2", @"3", @"4", @"5"]; NSArray *newArray = [[array.rac_sequence map:^id _Nullable(id _Nullable value) { NSLog(@"数组内容:%@", value); return @"0"; // 将所有内容替换为 0 }] array];
/* 内容快速替换 */ NSArray *array = @[@"1", @"2", @"3", @"4", @"5"]; NSArray *newArray = [[array.rac_sequence mapReplace:@"0"] array]; // 将所有内容替换为 0
5. 监听 TextField 的输入改变
可以省去设置 delegate 和实现代理方法的步骤。
/* 监听 TextField 的输入(内容改变就会调用) */ [[textField rac_textSignal] subscribeNext:^(NSString * _Nullable x) { NSLog(@"输入框内容:%@", x); }];
/* 添加监听条件 */ [[textField.rac_textSignal filter:^BOOL(NSString * _Nullable value) { return value.length > 5; // 表示输入文字长度 > 5 时才会调用下面的 block }] subscribeNext:^(NSString * _Nullable x) { NSLog(@"输入框内容:%@", x); }];
6. 监听 Button 点击事件
可以省去 addTarget 添加事件和创建方法的步骤。
[[button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) { NSLog(@"%@ 按钮被点击了", x); // x 是 button 按钮对象 }];
7. 登录按钮状态实时监听
下面表示只有 用户名 和 密码 输入框内容都大于 0 时,登录 按钮才可以点击,而且状态是实时监听的,一句代码就能完成这个功能。
RAC(_loginButton, enabled) = [RACSignal combineLatest:@[_username.rac_textSignal, _password.rac_textSignal] reduce:^id _Nullable(NSString * username, NSString * password){ return @(username.length && password.length); }];
8. 监听 Notification 通知事件
可省去在 -(void)dealloc {} 中清除通知和监听通知创建方法的步骤。
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardDidShowNotification object:nil] subscribeNext:^(NSNotification * _Nullable x) { NSLog(@"%@ 键盘弹起", x); // x 是通知对象 }];
9. 代替 Delegate 代理方法
可以省去监听以及设置 delegate 的步骤,下面表示只要 view 中执行了 btnClick 这个方法,就会发送信号执行这个回调。
[[view rac_signalForSelector:@selector(btnClick)] subscribeNext:^(RACTuple * _Nullable x) { NSLog(@" view 中的按钮被点击了"); }];
10. 代替 KVO 监听
可以代替 KVO 监听,下面表示把监听 view 的 frame 属性改变转换成信号,只要值改变就会发送信号。
[[view rac_valuesForKeyPath:@"frame" observer:self] subscribeNext:^(id _Nullable x) { NSLog(@"属性的改变:%@", x); // x 是监听属性的改变结果 }];
还有一种更简单的写法,就是利用 RAC 的宏,和上面的效果是一样的。
[RACObserve(view, frame) subscribeNext:^(id _Nullable x) { NSLog(@"属性的改变:%@", x); // x 是监听属性的改变结果 }];
11. 代替 NSTimer 计时器
可以代替 NSTimer 使用。
@interface ViewController () @property (nonatomic, strong) RACDisposable *disposable; @end
/* 定义计时器监听 */ self.disposable = [[RACSignal interval:1.0 onScheduler:[RACScheduler mainThreadScheduler]] subscribeNext:^(NSDate * _Nullable x) { NSLog(@"当前时间:%@", x); // x 是当前的系统时间 /* 关闭计时器 */ [_disposable dispose]; }];
持续更新,学习到新的知识在记录下来,有需要的可以收藏一下。
将来的你,一定会感激现在拼命的自己,愿自己与读者的开发之路无限美好。
发表评论
-
带你深入理解 FLUTTER 中的字体“冷”知识
2020-08-10 23:40 635本篇将带你深入理解 Flutter 开发过程中关于字体和文 ... -
Flutter -自定义日历组件
2020-03-01 17:56 1111颜色文件和屏幕适配的文件 可以自己给定 import ... -
Dart高级(一)——泛型与Json To Bean
2020-02-23 19:13 1005从 Flutter 发布到现在, 越来越多人开始尝试使用 Da ... -
flutter loading、Progress进度条
2020-02-21 17:03 1181Flutter Progress 1 条形无固定值进度条 ... -
Flutter使用Https加载图片
2020-02-21 01:39 1020Flutter使用Https加载图片 使用http加载图片出 ... -
flutter shared_preferences 异步变同步
2020-02-21 00:55 848前言 引用 在开发原生iOS或Native应用时,一般有判断上 ... -
Flutter TextField边框颜色
2020-02-19 21:31 937监听要销毁 myController.dispose(); T ... -
flutter Future的正确用法
2020-02-18 21:55 808在flutter中经常会用到异步任务,dart中异步任务异步处 ... -
记一次Flutter简单粗暴处理HTTPS证书检验方法
2020-02-18 14:13 979最近在做Flutter项目到了遇到一个无解的事情,当使用Ima ... -
flutter 获取屏幕宽度高度 通知栏高度等屏幕信息
2019-07-27 08:39 1344##MediaQuery MediaQuery.of(con ... -
Mac上制作Centos7系统U盘安装盘
2019-07-23 11:25 651Centos7 下载地址: https://www.cento ... -
关于flutter RefreshIndicator扩展listview下拉刷新的问题
2019-07-10 19:40 1143当条目过少时listview某些嵌套情况下可能不会滚动(条目 ... -
flutter listview 改变状态的时候一直无限添加
2019-07-10 16:01 791setstate的时候会一直无限的调用listview.bui ... -
Flutter Android端启动白屏问题的解决
2019-07-09 00:51 1525问题描述 Flutter 应用在 Android 端上启动时 ... -
Flutter中SnackBar使用
2019-07-08 23:43 781底部弹出,然后在指定时间后消失。 注意: build(Bui ... -
Flutter 之点击空白区域收起键盘
2019-07-08 18:43 1792点击空白处取消TextField焦点这个需求是非常简单的,在学 ... -
Flutter 弹窗 Dialog ,AlertDialog,IOS风格
2019-07-08 18:04 1383import 'package:flutter/mate ... -
flutter ---TextField 之 输入类型、长度限制
2019-07-08 14:30 2337TextField想要实现输入类型、长度限制需要先引入impo ... -
【flutter 溢出BUG】键盘上显示bottom overflowed by 104 PIXELS
2019-07-08 11:13 1567一开始直接使用Scaffold布局,body:new Colu ... -
解决Flutter项目卡在Initializing gradle...界面的问题
2019-07-07 12:53 880Flutter最近很火,我抽出了一点时间对Flutter进行了 ...
相关推荐
github地址:https://github.com/sallenhandong/MVVM-RACDemo 多多star 给点动力啦 最近一直在学习RAC 所以就准备 吧常用的方法 以demo的形式 整理出来 还在学习当中 会把学到的 一点点更新 希望大家共同进步
在iOS开发中,ReactiveCocoa(简称RAC)是一个强大的框架,用于处理事件流和数据绑定。这个压缩包“ios-RAC实现登录页面.zip”显然包含了一个使用RAC实现登录页面的示例项目,名为“RAC_Login”。在这个项目中,...
iOS 开发中,ReactiveCocoa(简称RAC)是一个强大的响应式编程框架,它基于函数响应式编程的思想,将事件流和数据处理转换为可组合的信号。这个"ios RAC 框架 demo"是针对初学者设计的,旨在帮助开发者快速理解和...
标题 "ios-RAC.zip" 暗示了这个压缩包包含了一个关于iOS开发的示例项目,使用了ReactiveCocoa框架。ReactiveCocoa(RAC)是Apple平台上的一个响应式编程库,它是基于Functional Reactive Programming (FRP)理念的。...
张星宇在自己的iOS开发中使用了RAC来处理异步操作。 9. Apple Store应用程序:Apple Store是一个应用程序商店,提供了大量的应用程序供用户下载。张星宇在自己的iOS开发中开发了多个应用程序,并将其发布到Apple ...
【标题】"ios-rac mvvm 简化vc.zip" 涉及的主要知识点是iOS应用开发中的架构模式——ReactiveCocoa(RAC)和Model-View-ViewModel(MVVM),以及如何利用这些技术来简化ViewController(VC)的管理。 **...
在iOS应用开发中,ReactiveCocoa(简称RAC)是一种强大的响应式编程框架,它源自于函数式编程思想,并且被广泛应用于处理事件流、数据流和UI更新。在这个"iOS-RAC-实际开发案例-登录注册-Demo"中,我们将深入探讨...
在iOS开发中,MVVM配合RAC的实践步骤: 1. **创建ViewModel**:定义ViewModel类,包含Model的数据以及业务逻辑。这些逻辑可以通过RAC信号来表示,例如`@Published`属性或`RACSubject`。 2. **数据绑定**:在View中...
AFNetworking是iOS应用开发中广泛使用的第三方网络库,它为开发者提供了...在实际开发中,结合其他框架如Moya(基于AFNetworking的更高抽象)或RAC(ReactiveCocoa)进行使用,可以进一步提升代码的可读性和可维护性。
在iOS开发中,ReactiveCocoa(RAC)是一种强大的响应式编程框架,它引入了函数式编程的概念,帮助开发者以更简洁、声明式的方式处理事件和数据流。本分析主要聚焦于RAC的底层实现原理,通过深入源码,揭示其工作方式...
SSKit是一款简易的、MVVM模式的iOS开发框架 能够快速地、动态性地配置项目,简单易学入门低,能够很轻易地解决项目中常见框架设计问题。 github地址:https://github.com/bassamyan/SSKitDemo
本项目以“iOS组件化开发项目架构设计,结合MVVM设计模式+RAC数据绑定+Pod组件管理”为主题,旨在提供一种高效且灵活的开发模式。下面将详细介绍这些关键概念。 1. **组件化开发** - **目标**:组件化的主要目标是...
在iOS开发中,ReactiveCocoa(简称RAC)是一个强大的响应式编程框架,它源自于Functional Reactive Programming(FRP)的理念。RAC允许开发者通过声明式的方式处理事件和数据流,极大地提高了代码的可读性和可维护性...
iOS 组件化开发项目架构设计,结合 MVVM 设计模式 + RAC 数据绑定 + Pod 组件管理, 实现一套实战性的iOS组件化架构iOS 组件化开发项目架构设计,结合 MVVM 设计模式 + RAC 数据绑定 + Pod 组件管理, 实现一套实战...
EasyIOS 2.0是基于MVVM编程思想进行构建的,封装了Scene,SceneModel,Model,Action四种模型来对IOS进行开发,4种模型的定义解决了IOS开发中ViewController承担了过多角色而造成的代码质量低下,使得结构思路更加...
使用MVVM月RAC编写的cell自适应高度的demo
在"Rac使用demo"中,我们将深入探讨如何利用ReactiveCocoa进行实际的iOS应用开发。 响应式编程是一种编程范式,它允许开发者以一种声明式的方式来处理事件和数据流。在iOS开发中,这意味着你可以定义数据的变化如何...
Oracle RAC,全称Real Application Clusters,是Oracle数据库的一项高级特性,旨在提供高可用性和可伸缩性。Oracle RAC允许多台服务器共享同一数据库,分担工作负载,提高系统的整体性能和容错能力。 一、Oracle ...
在iOS应用开发中,第三方库扮演着至关重要的角色,它们为开发者提供了丰富的功能,提高了开发效率,降低了出错的可能性。以下是一些常见的iOS开发中常用的第三方库及其详细说明: 1. **Alamofire** - Alamofire 是...