ReactiveCocoa現(xiàn)在已經(jīng)是到5.X版本拐迁,2.X及以下適合OC項(xiàng)目铺韧,3.X適合Swift 1.X版本哈打,4.X適合Swift 2.X 版本,5.X適合Swift 3.X版本,鑒于項(xiàng)目中OC代碼較多肺孵,暫時(shí)就根據(jù)最新的2.5進(jìn)行研究凳怨。ReactiveCocoa由兩大主要部分組成:signals (RACSignal) 和 sequences (RACSequence)紫新。
signal 和 sequence 都是streams,他們共享很多相同的方法偶芍。ReactiveCocoa在功能上做了語(yǔ)義豐富、一致性強(qiáng)的一致性設(shè)計(jì):signal是push驅(qū)動(dòng)的stream德玫,sequence是pull驅(qū)動(dòng)的stream匪蟀。
Sequence是一種集合,很像 NSArray宰僧,但和數(shù)組不同的是萄窜,一個(gè)sequence里的值默認(rèn)是延遲加載的(只有需要的時(shí)候才加載),這樣的話如果sequence只有一部分被用到撒桨,那么這種機(jī)制就會(huì)提高性能查刻。像Cocoa的集合類型一樣,sequence不接受 nil值.RACSequence允許任意Cocoa集合在統(tǒng)一且顯式地進(jìn)行操作凤类。
ReactiveCocoa導(dǎo)入
ReactiveCocoa可以通過(guò)下載直接添加到項(xiàng)目中穗泵,ReactiveCocoa本來(lái)不支持CocoaPods,開(kāi)源組織將其加入CocoaPods中谜疤,使用起來(lái)也很方便:
platform:ios,”8.0”
pod'ReactiveCocoa’,’2.5’
數(shù)組與序列
ReactiveCocoa中可以通過(guò)RACSequence對(duì)數(shù)組進(jìn)行操作佃延,RACSequence繼承自RACStream,ReactiveCocoa中流的一種现诀,我們可以對(duì)數(shù)組進(jìn)行map,filter履肃,reduce仔沿,skip,take尺棋,contact..操作封锉,簡(jiǎn)單操作其中的幾種:
NSArray *array=@[@(2),@(5),@(7),@(15)];
RACSequence *sequence = [array rac_sequence];
id mapData = [sequence map:^id(id value) {
return @([value integerValue] * 2);
}];
NSLog(@"序列Map之后的數(shù)據(jù):%@",[mapData array]);
id filterData = [sequence filter:^BOOL(id value) {
return [value integerValue]%2 == 0;
}];
NSLog(@"序列Filter之后的數(shù)據(jù):%@",[filterData array]);
id reduceData = [sequence foldLeftWithStart:@"" reduce:^id(id accumulator, id value) {
return [accumulator stringByAppendingString:[value stringValue]];
}];
NSLog(@"序列Left-Reduce之后的數(shù)據(jù):%@",reduceData);
id rightReduceData = [sequence foldRightWithStart:@"" reduce:^id(id first, RACSequence *rest) {
return [NSString stringWithFormat:@"%@%@", rest.head, first];
}];
NSLog(@"序列Right-Reduce之后的數(shù)據(jù):%@",rightReduceData);
id skipData = [sequence skip:1];
NSLog(@"序列Skip之后的數(shù)據(jù):%@",[skipData array]);
id takeData = [sequence take:2];
NSLog(@"序列Take之后的數(shù)據(jù):%@",[takeData array]);
id takeUntilData = [sequence takeUntilBlock:^BOOL(id x) {
return [x integerValue] == 7;
}];
NSLog(@"序列TakeUntil之后的數(shù)據(jù):%@",[takeUntilData array]);
NSArray *nextArr = @[@"A",@"B",@"C"];
RACSequence *nextSequence = [nextArr rac_sequence];
id contactData = [sequence concat:nextSequence];
NSLog(@"FlyElephant序列Contact之后的數(shù)據(jù):%@",[contactData array]);
小功能
我們可以通過(guò)流進(jìn)行創(chuàng)建數(shù)組,也可以通過(guò)數(shù)據(jù)進(jìn)行測(cè)試:
BOOL result = [sequence any:^BOOL(id value) {
return [value integerValue] > 10;
}];
NSLog(result ? @"array中有數(shù)字大于10" : @"array中沒(méi)有數(shù)字大于10");
result = [array.rac_sequence all:^BOOL(id value) {
return [value integerValue] < 24;
}];
NSLog(result?@"array中所有的數(shù)字小于24":@"數(shù)據(jù)中有數(shù)字大于24");
RACSequence *customSequence = [RACSequence sequenceWithHeadBlock:^id{
return @7;
} tailBlock:^RACSequence *{
return [@[@25] rac_sequence];
}];
NSLog(@"Head:%@--Tail:%@--Array:%@",customSequence.head,customSequence.tail,[customSequence array]);