iOS-创建自己的Signal工具类(一)

原创 2017年01月03日 15:08:25

本文首发地址

之前说都是使用,如果有不明白的地方可以查看
iOS深入了解ReactiveCocoa的使用(一)
iOS深入了解ReactiveCocoa的使用(二)
这两篇文章。

下载DEMO

最近看一些招聘信息的时候,尽然有人提到熟悉ReactiveCocoa。并且还是所谓的加分项。对于这个工具,熟练使用就好。一般工程不建议使用。

个人暂时觉得有一下几点:(以后待补充–不喜欢就别喷)
1:工具包太大
2:出问题了,调试非常不容易。
3:信号漫天飞。
4:工程需要用到的功能,可能就需要ReactiveCocoa他的一点点功能而已。资源占用太大

好了废话不多说。直接进入主题。

不用去罗列图片什么的,咱们直接进入代码看。

  1. 先要弄明白两个名词
    1:订阅者-接受信号,接受发布者发出的信号内容
    2:发布者-发布信号,订阅者发送数据源
  2. 使用过程
    1:订阅者就用subscribeNext:(void (^)(id x))nextBlock
    2: 发布信号sendNext:(id)value
  3. 发布到订阅流程
    首先订阅信号
    在订阅信号的时候,主要通过订阅RACBaseProctal这个协议。

顺便当前的对象也接受了这个协议,就要实现这个接口的方法。
编写自己的信号,我就写了其中的一个方法

B1C0202B-0AE7-469A-AD25-0F8F2873365A.png

在订阅信号的时候,系统做了一个假的堆栈。其实就是用一个数组,去装填接受了订阅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信号导致程序崩溃处理

主要是参考matt大神的博客:http://www.cocoawithlove.com/2010/05/handling-unhandled-exceptions-and.html       。 ...
  • u011615945
  • u011615945
  • 2014年07月23日 10:39
  • 1253

ios 收集crash xcode 调试 捕捉signal信号

//处理信号类型的异常 void SignalExceptionHandler(int signal) {          NSMutableString *mstr = [[NSMutab...
  • ssyyjj88
  • ssyyjj88
  • 2017年06月20日 11:54
  • 655

Xcode里调试signal的信号回调处理函数

但是在Xcode里调试的时候,程序不会进入bugrpt_signalHandler处理函数里面,为什么呢? 因为Xcode屏蔽了signal的回调,我们需要在lldb中输入以下命令,signal的回调...
  • skylin19840101
  • skylin19840101
  • 2016年11月04日 10:06
  • 568

ReactiveCocoa框架菜鸟入门——信号(Signal)详解 第四课

ReactiveCocoa是一个框架,它能让你在iOS应用中使用函数响应式编程(FRP)技术。在本系列教程的第一部分中,你学到了如何将标准的动作与事件处理逻辑替换为发送事件流的信号。你还学到了如何转换...
  • qq_30798575
  • qq_30798575
  • 2016年02月24日 19:18
  • 791

java基础知识之工具类的创建

静态的应用。 每一个应用程序中都有共性的功能, 可以将这些功能进行抽取,独立封装。 以便复用。 虽然可以通过建立ArrayTool的对象使用这些工具方法,对数组进行操作。 发...
  • maixia24
  • maixia24
  • 2014年08月01日 23:02
  • 1583

定制自己的java工具类

在java语言学习的过程中,我们可以创建自己的工具库来减少或消除重复的程序代码。 比如说我们可以用我们自己构建的类Print来代替System.out.print()以减少输入负担。 首先创建一...
  • haiyoung
  • haiyoung
  • 2015年08月14日 15:12
  • 1590

Java 让工具类不可实例化

java 项目中使用的工具类非常多,比如JDK自己的工具java.lang.Math 、java.util.Collections 等都是我们经常用到的工具类。工具类的属性和方法都是静态的,不需要生成...
  • qq_34579060
  • qq_34579060
  • 2018年01月18日 14:24
  • 18

自己写的UiUtils工具类

UiUtils.java package com.baofoo.mobile.wallet.common.utils; import android.content.Context; import...
  • u012246458
  • u012246458
  • 2017年04月24日 14:01
  • 552

laravel创建工具类的过程

创建laravel工具类
  • logic_lai
  • logic_lai
  • 2017年11月16日 11:18
  • 134

3.2 创建自己的类

一、复习 1、数据类型转换的方式 2、Char中的三个方法 二、 新课 (一)创建属于自己的类 圆类 1、分析:表述一个圆需要哪些要素?     ——圆心,半径                  ...
  • bluechen10
  • bluechen10
  • 2017年03月12日 11:46
  • 105
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS-创建自己的Signal工具类(一)
举报原因:
原因补充:

(最多只允许输入30个字)