ReactiveCocoa相关MVVM+ReactiveCocoaiOS学习笔记

ReactiveCocoa-RACSequence与NSArra

2016-09-27  本文已影响506人  FlyElephant

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

上一篇下一篇

猜你喜欢

热点阅读