ReactiveCocoa-RACSequence与NSArra

作者: FlyElephant | 来源:发表于2016-09-27 15:39 被阅读506次

    ReactiveCocoa现在已经是到5.X版本,2.X及以下适合OC项目,3.X适合Swift 1.X版本,4.X适合Swift 2.X 版本,5.X适合Swift 3.X版本,鉴于项目中OC代码较多,暂时就根据最新的2.5进行研究.ReactiveCocoa由两大主要部分组成:signals (RACSignal) 和 sequences (RACSequence)。
    signal 和 sequence 都是streams,他们共享很多相同的方法。ReactiveCocoa在功能上做了语义丰富、一致性强的一致性设计:signal是push驱动的stream,sequence是pull驱动的stream。

    Sequence是一种集合,很像 NSArray,但和数组不同的是,一个sequence里的值默认是延迟加载的(只有需要的时候才加载),这样的话如果sequence只有一部分被用到,那么这种机制就会提高性能。像Cocoa的集合类型一样,sequence不接受 nil值.RACSequence允许任意Cocoa集合在统一且显式地进行操作。

    ReactiveCocoa导入

    ReactiveCocoa可以通过下载直接添加到项目中,ReactiveCocoa本来不支持CocoaPods,开源组织将其加入CocoaPods中,使用起来也很方便:
    <pre><code>platform:ios,”8.0” pod'ReactiveCocoa’,’2.5’</code></pre>

    数组与序列

    ReactiveCocoa中可以通过RACSequence对数组进行操作,RACSequence继承自RACStream,ReactiveCocoa中流的一种,我们可以对数组进行map,filter,reduce,skip,take,contact..操作,简单操作其中的几种:
    <pre><code>`

    NSArray *array=@[@(2),@(5),@(7),@(15)];
    RACSequence *sequence = [array rac_sequence];
    id mapData = [sequence map:^id(id value) {
        return @([value integerValue] * 2);
    }];
    NSLog(@"序列Map之后的数据:%@",[mapData array]);
    
    id filterData = [sequence filter:^BOOL(id value) {
        return [value integerValue]%2 == 0;
    }];
    NSLog(@"序列Filter之后的数据:%@",[filterData array]);
    
    id reduceData = [sequence foldLeftWithStart:@"" reduce:^id(id accumulator, id value) {
        return [accumulator stringByAppendingString:[value stringValue]];
    }];
    NSLog(@"序列Left-Reduce之后的数据:%@",reduceData);
    
    id rightReduceData = [sequence foldRightWithStart:@"" reduce:^id(id first, RACSequence *rest) {
       return [NSString stringWithFormat:@"%@%@", rest.head, first];
    }];
    NSLog(@"序列Right-Reduce之后的数据:%@",rightReduceData);
    
    id skipData = [sequence skip:1];
    NSLog(@"序列Skip之后的数据:%@",[skipData array]);
    
    
    id takeData = [sequence take:2];
    NSLog(@"序列Take之后的数据:%@",[takeData array]);
    
    id takeUntilData = [sequence takeUntilBlock:^BOOL(id x) {
        return [x integerValue] == 7;
    }];
    NSLog(@"序列TakeUntil之后的数据:%@",[takeUntilData array]);
    
    NSArray *nextArr = @[@"A",@"B",@"C"];
    RACSequence *nextSequence = [nextArr rac_sequence];
    id contactData = [sequence concat:nextSequence];
    NSLog(@"FlyElephant序列Contact之后的数据:%@",[contactData array]);`</code></pre>
    

    小功能

    我们可以通过流进行创建数组,也可以通过数据进行测试:
    <pre><code>`
    BOOL result = [sequence any:^BOOL(id value) {
    return [value integerValue] > 10;
    }];
    NSLog(result ? @"array中有数字大于10" : @"array中没有数字大于10");

    result = [array.rac_sequence all:^BOOL(id value) {
        return [value integerValue] < 24;
    }];
    NSLog(result?@"array中所有的数字小于24":@"数据中有数字大于24");
    
    RACSequence *customSequence = [RACSequence sequenceWithHeadBlock:^id{
        return @7;
    } tailBlock:^RACSequence *{
        return [@[@25] rac_sequence];
    }];
    NSLog(@"Head:%@--Tail:%@--Array:%@",customSequence.head,customSequence.tail,[customSequence array]);`</code></pre>
    

    参考链接
    Reactive​Cocoa

    相关文章

      网友评论

        本文标题:ReactiveCocoa-RACSequence与NSArra

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