1. 程式人生 > >這樣好用的ReactiveCocoa,根本停不下來

這樣好用的ReactiveCocoa,根本停不下來

前戲

我個人非常推崇ReactiveCocoa,它就像中國的太極,太極生兩儀,兩儀生四象,四象生八卦,八卦生萬物。ReactiveCocoa是一個高度抽象的程式設計框架,它真的很抽象,初看你不知道它是要幹嘛的,等你用上了之後,就發現,有了它你是想幹嘛就幹嘛,編碼從未如此流暢。

在此我不會講ReactiveCocoa的原理,因為不能講明白的才叫抽象。我也不會提及相關概念。我只是讓你看看我用著它是有多爽。

程式碼的四十八手

察值

你別動,你一動我就知道。

Objective-C
12345 @weakify(self);[RACObserve(self,value) subscribeNext:^(NSString*x){@strongify(self);NSLog(@"你動了");}];

單邊

你唱歌,我就跳舞。

textField的內容長度隱射成BOOL值,繫結到confirmButton的enable屬性上面,當textField輸入內容不為空的時候,confirmButton的enable = YES。

Objective-C
1234567891011 RACSignal*signalA=[RACSignal createSignal:^RACDisposable*(id<RACSubscriber>subscriber){[subscriber sendNext:@"唱歌"];[subscriber sendCompleted];returnnil;}];RAC(self,value)=[signalA map:^id(NSString*value){if([value isEqualToString:@"唱歌"]){return@"跳舞";}return@"";}];

雙邊

你向西,他就向東,他向左,你就向右。

Objective-C
1234567891011121314151617181920212223242526 RACChannelTerminal*channelA=RACChannelTo(self,valueA);RACChannelTerminal*channelB=RACChannelTo(self,valueB);[[channelA map:^id(NSString*value){if([value isEqualToString:@"西"]){return@"東";}returnvalue;}] subscribe:channelB];[[channelB map:^id(NSString*value){if([value isEqualToString:@"左"]){return@"右";}returnvalue;}] subscribe:channelA];[[RACObserve(self,valueA) filter:^BOOL(idvalue){returnvalue? YES : NO;}] subscribeNext:^(NSString*x){NSLog(@"你向%@",x);}];[[RACObserve(self,valueB) filter:^BOOL(idvalue){returnvalue? YES : NO;}] subscribeNext:^(NSString*x){NSLog(@"他向%@",x);}];self.valueA=@"西";self.valueB=@"左";
Objective-C
1234 2015-08-1520:14:46.544Test[2440:99901]你向西2015-08-1520:14:46.544Test[2440:99901]他向東2015-08-1520:14:46.545Test[2440:99901]他向左2015-08-1520:14:46.545Test[2440:99901]你向右

代理

你是程式設計師,你幫我寫個app吧。

Objective-C
123 @protocolProgrammer<NSObject>-(void)makeAnApp;@end
Objective-C
1234567 RACSignal*ProgrammerSignal=[self rac_signalForSelector:@selector(makeAnApp)               fromProtocol:@protocol(Programmer)];[ProgrammerSignal subscribeNext:^(RACTuple*x){NSLog(@"花了一個月,app寫好了");}];[selfmakeAnApp];
Objective-C
1 2015-08-1520:46:45.720Test[2817:114564]花了一個月,app寫好了

廣播

知道你的頻道,我就能聽到你了。

Objective-C
1234 [[[NSNotificationCenterdefaultCenter] rac_addObserverForName:@"程式碼之道頻道" object:nil] subscribeNext:^(NSNotification*x){NSLog(@"技巧:%@",x.userInfo[@"技巧"]);}];[[NSNotificationCenterdefaultCenter] postNotificationName:@"程式碼之道頻道" object:nil userInfo:@{@"技巧":@"用心寫"}];
Objective-C
1 2015-08-1520:41:15.786Test[2734:111505]技巧:用心寫

連線

生活是一個故事接一個故事。

Objective-C
12345678910111213 RACSignal*signalA=[RACSignal createSignal:^RACDisposable*(id<RACSubscriber>subscriber){[subscriber sendNext:@"我戀愛啦"];[subscriber sendCompleted];returnnil;}];RACSignal*signalB=[RACSignal createSignal:^RACDisposable*(id<RACSubscriber>subscriber){[subscriber sendNext:@"我結婚啦"];[subscriber sendCompleted];returnnil;}];[[signalA concat:signalB] subscribeNext:^(idx){NSLog(@"%@",x);}];
Objective-C
12 2015-08-1512:19:46.707Test[1845:64122]我戀愛啦2015-08-1512:19:46.707Test[1845:64122]我結婚啦

合併

汙水都應該流入汙水處理廠被處理。

Objective-C
1234567891011 RACSignal*signalA=[RACSignal createSignal:^RACDisposable*(id<RACSubscriber>subscriber){[subscriber sendNext:@"紙廠汙水"];returnnil;}];RACSignal*signalB=[RACSignal createSignal:^RACDisposable*(id<RACSubscriber>subscriber){[subscriber sendNext:@"電鍍廠汙水"];returnnil;}];[[RACSignal merge:@[signalA,signalB]] subscribeNext:^(idx){NSLog(@"處理%@",x);}];
Objective-C
12 2015-08-1512:10:05.371Test[1770:60147]處理紙廠汙水2015-08-1512:10:05.372Test[1770:60147]處理電鍍廠汙水

組合

你是紅的,我是黃的,我們就是紅黃的,你是白的,我沒變,我們是白黃的。

Objective-C