美文网首页专注iOS开发(OC/Swift)
iOS-创建自己的Signal工具类(一)

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

作者: 洲洲哥 | 来源:发表于2016-12-29 14:10 被阅读492次

    本文首发地址
    之前说都是使用,如果有不明白的地方可以查看
    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工具类(一)

        本文链接:https://www.haomeiwen.com/subject/ofgyvttx.html