iOS-创建自己的Signal工具类(一)
来源:互联网 发布:二维正态分布 知乎 编辑:程序博客网 时间:2024/06/05 23:07
之前说都是使用,如果有不明白的地方可以查看
iOS深入了解ReactiveCocoa的使用(一)
iOS深入了解ReactiveCocoa的使用(二)
这两篇文章。
下载DEMO
最近看一些招聘信息的时候,尽然有人提到熟悉ReactiveCocoa。并且还是所谓的加分项。对于这个工具,熟练使用就好。一般工程不建议使用。
个人暂时觉得有一下几点:(以后待补充–不喜欢就别喷)
1:工具包太大
2:出问题了,调试非常不容易。
3:信号漫天飞。
4:工程需要用到的功能,可能就需要ReactiveCocoa他的一点点功能而已。资源占用太大
好了废话不多说。直接进入主题。
不用去罗列图片什么的,咱们直接进入代码看。
- 先要弄明白两个名词
1:订阅者-接受信号,接受发布者发出的信号内容
2:发布者-发布信号,订阅者发送数据源
- 使用过程
1:订阅者就用subscribeNext:(void (^)(id x))nextBlock
2: 发布信号sendNext:(id)value - 发布到订阅流程
首先订阅信号
在订阅信号的时候,主要通过订阅RACBaseProctal
这个协议。
顺便当前的对象也接受了这个协议,就要实现这个接口的方法。 编写自己的信号,我就写了其中的一个方法
在订阅信号的时候,系统做了一个假的堆栈。其实就是用一个数组,去装填接受了订阅RACBaseProctal
的对象。
于是乎看下面的代码
// 组装对象- (NSMutableArray * )subscribeNext:(void (^)(id x))nextBlock { NSCParameterAssert(nextBlock != NULL); RACBaseProctal * Proctal = [RACBaseProctal subscriberWithNext:nextBlock]; return [self subscribe:Proctal];}// 向数组中装填接受了RACBaseProctal的对象- (NSMutableArray *)subscribe:(id<RACBaseProctal>)subscriber { NSCParameterAssert(subscriber != nil); NSMutableArray *subscribers = self.subscribers; @synchronized (subscribers) { [subscribers addObject:subscriber]; } @synchronized (subscribers) { // 根据条件用来获取一个NSUIndex 对象,主要是根据条件进行数据遍历使用 // 这里添加了一个参数,用来表示遍历是从前向后遍历还是从后遍历。 // NSInteger index = [subscribers indexOfObjectWithOptions:(NSEnumerationReverse) passingTest:^BOOL(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { // return obj == subscriber; // }]; // if (index != NSNotFound) [subscribers removeObjectAtIndex:index]; } return subscribers;}
NOTICE:
在这个过程中,组装了一个装有RACBaseProctal的对象
的数组,并且还把(void (^)(id x))nextBlock
一块组装。
重点来了!!!!
注意这个nextBlock就是我们要使用的发送信号
的Block。
4.发布流程
看看发布信号的代码
- (void)enumerateSubscribersUsingBlock:(void (^)(id<RACBaseProctal> subscriber))block { NSArray *subscribers; @synchronized (self.subscribers) { subscribers = [self.subscribers copy]; } for (id<RACBaseProctal> subscriber in subscribers) { block(subscriber); }}#pragma mark - RACBaseProctalDelegate- (void)sendNext:(id)value { [self enumerateSubscribersUsingBlock:^(id<RACBaseProctal> subscriber) { [subscriber sendNext:value]; }];}
这里就是要循环遍历在订阅信号的时候组建的数组了。换一句话说就是,你有多少个订阅者,就会对应生产多大的数组。一个发布者就可以对应多个订阅者了。这里是精髓
发布就很简单了就是一个Block。
但是这个Block和我们订阅信号的Block对比看一下。
我们发信信号的Block
-(void)sendNext:(id)value { @synchronized (self) { void (^nextBlock)(id) = [self.next copy]; if (nextBlock == nil) return; nextBlock(value); }}
订阅发布信号的Block
+ (instancetype)subscriberWithNext:(void (^)(id x))next { RACBaseProctal *protocal = [[self alloc] init]; protocal->_next = [next copy]; return protocal;}
这所有的信息都在这个RACBaseProctal
接口协议中完成。对比我们可知。
这么一系列的转换,其实就是在搞同一个Block。发布信号就执行这个Block,订阅信号就输出这个。
于是乎,之乎者也。
如有问题可添加我的QQ:1290925041
还可添加QQ群:234812704(洲洲哥学院)
欢迎各位一块学习,提高逼格!
也可以添加洲洲哥的微信公众号
更多消息
更多信iOS开发信息 请以关注洲洲哥 的微信公众号,不定期有干货推送:
- iOS-创建自己的Signal工具类(一)
- 自己用的工具类(一)
- IOS创建自己的框架
- (原创)分享自己写的几个工具类(一)防止重复点击工具类
- 创建一个 iOS 的 Widget (一)
- 定制自己的Unity场景编辑工具界面(一)
- 实现自己的网络请求工具(一)
- cocos2d-x学习笔记【一】创建自己的场景类
- asp.net mvc 的webApi (一)自己手动创建
- joomla component学习笔记(一)--创建自己的组件
- ContentProvider 实例详解一(创建一个自己的ContentProvider)
- 创建自己的AngularJS - 作用域继承(一)
- 如何创建属于自己的Git(一)
- iOS 开发工具 打造自己的代码
- 编写自己的json解析工具一
- ios开发 创建自己的工程模板
- iOS中创建自己的框架
- ios中创建自己的框架
- 编译模块出错:insmod: ERROR: could not insert module module.ko: Invalid parameters
- 关于os的一系列问题:寻找目录中的视频文件,并存储路径
- [Android] PermissionUtil
- SRAM、DRAM、SDRAM等存储器的区别?
- 架构师的成功之路。。。
- iOS-创建自己的Signal工具类(一)
- 关于正则表达式表示浮点数记录
- nginx|apache|tomcat 配置htttps
- Neural Style论文笔记+源码解析
- ZCMU-1670-和费马开个玩笑(数据范围)
- iOS 16进制颜色使用
- SharedPreference的封装
- React入门到精通(二)——React基础实例
- Swift 面试题