這樣好用的ReactiveCocoa,根本停不下來
阿新 • • 發佈:2019-01-13
前戲
我個人非常推崇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-C1234567891011 | 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=@"左"; |
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]你向右 |
代理
Objective-C你是程式設計師,你幫我寫個app吧。
123 | @protocolProgrammer<NSObject>-(void)makeAnApp;@end |
1234567 | RACSignal*ProgrammerSignal=[self rac_signalForSelector:@selector(makeAnApp) fromProtocol:@protocol(Programmer)];[ProgrammerSignal subscribeNext:^(RACTuple*x){NSLog(@"花了一個月,app寫好了");}];[selfmakeAnApp]; |
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:@{@"技巧":@"用心寫"}]; |
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);}]; |
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);}]; |
12 | 2015-08-1512:10:05.371Test[1770:60147]處理紙廠汙水2015-08-1512:10:05.372Test[1770:60147]處理電鍍廠汙水 |
組合
Objective-C你是紅的,我是黃的,我們就是紅黃的,你是白的,我沒變,我們是白黃的。