ReactiveCocoaの実際のプロジェクトでの使用(一)基本操作

6391 ワード

簡単に述べる
ReactiveCocoa(以下RACと略す)といえば、Swiftで広く使われている応答型プログラミングフレームワークRxSwiftを連想させやすい.その名の通り、RACはCocoaを持ってCocoaに対する支持がもっと良いことを説明しています.RxSwiftもCocoaに対して相応の支持をしていますが、公式ドキュメントからも説明することができます.RACは確かにCocoaに対する支持がSwiftよりも広く、RACの最終目的もCocoaに対する支持に偏っている可能性があります.
1、never信号
nextイベントを送信せず、イベントを完了しない信号を作成します.
RACSignal *signal = [RACSignal never];
[signal subscribeNext:^(id  _Nullable x) {
    NSLog(@"%@",x);
} completed:^{
    NSLog(@"%@",@"done");
}];

Result:
        ,      next               。

2、empty信号
完了信号しか送信できない信号を作成する
RACSignal *signal = [RACSignal empty];
[signal subscribeNext:^(id  _Nullable x) {
    NSLog(@"%@",x);
} completed:^{
    NSLog(@"%@",@"done");
}];

Result:
2017-08-21 15:55:05.114459+0800 ReactiveCocoaDemo[331:43141] done

3、create操作
ここでは,配列をシーケンスに変換して信号に変換し,この信号を購読して出力する例を示した.
NSArray *array = @[@1, @2, @3, @4, @5]; //      
[[[array.rac_sequence signalWithScheduler:RACScheduler.mainThreadScheduler] //                    
map:^id _Nullable(NSNumber *value) {
    return @(2 * value.integerValue); //map
}]
subscribeNext:^( NSNumber *num) { //          next   
    NSLog(@"%@",num);
} completed:^{  //     
    NSLog(@"done");
}];

Result:
2017-08-18 21:25:38.166 ReactiveCocoaDemo[2807:37246] 1
2017-08-18 21:25:38.166 ReactiveCocoaDemo[2807:37246] 2
2017-08-18 21:25:38.167 ReactiveCocoaDemo[2807:37246] 3
2017-08-18 21:25:38.167 ReactiveCocoaDemo[2807:37246] 4
2017-08-18 21:25:38.167 ReactiveCocoaDemo[2807:37246] 5
2017-08-18 21:25:38.168 ReactiveCocoaDemo[2807:37246] done

4、map操作
高度な開発言語に触れたことがある人はmapやfilterに慣れていないはずです.例えばes 6、pythonなどです.mapはRACではビーム交換柱に相当し,信号送信後からサブスクリプションにかけてハイジャックされて変更されたが,この例も同様に用いられる.
NSArray *array = @[@1, @2, @3, @4, @5]; //      
[[[array.rac_sequence signalWithScheduler:RACScheduler.mainThreadScheduler] //                    
map:^id _Nullable(NSNumber *value) {
    return @(2 * value.integerValue); //map
}]
subscribeNext:^( NSNumber *num) { //          next   
    NSLog(@"%@",num);
} completed:^{  //     
    NSLog(@"done");
}];
Result:
2017-08-18 22:09:23.978 ReactiveCocoaDemo[2887:58573] 2
2017-08-18 22:09:23.978 ReactiveCocoaDemo[2887:58573] 4
2017-08-18 22:09:23.978 ReactiveCocoaDemo[2887:58573] 6
2017-08-18 22:09:23.979 ReactiveCocoaDemo[2887:58573] 8
2017-08-18 22:09:23.979 ReactiveCocoaDemo[2887:58573] 10
2017-08-18 22:09:23.979 ReactiveCocoaDemo[2887:58573] done

データが変更されていることがわかります.
5、filter操作
filterは英語で漏斗と訳され、フィルタリングの意味を意味する.機能は役に立つものを濾過することです.以下は例です.
NSArray *array = @[@1, @2, @3, @4, @5]; //      
[[[array.rac_sequence signalWithScheduler:RACScheduler.mainThreadScheduler] //                    
filter:^BOOL(NSNumber *value) {
    return value.integerValue >  3; //        
}]
subscribeNext:^( NSNumber *num) { //          next   
    NSLog(@"%@",num);
} completed:^{  //     
    NSLog(@"done");
}];

Result:
2017-08-19 08:11:34.864 ReactiveCocoaDemo[3033:69014] 4
2017-08-19 08:11:34.865 ReactiveCocoaDemo[3033:69014] 5
2017-08-19 08:11:34.865 ReactiveCocoaDemo[3033:69014] done

6、take操作
前のいくつかの信号が送信されたnextのvalueを取ることを意味します.
NSArray *array = @[@1, @2, @3, @4, @5]; //      
[[[array.rac_sequence signalWithScheduler:RACScheduler.mainThreadScheduler] //                    
  take:1] //    
 subscribeNext:^( NSNumber *num) { //          next   
     NSLog(@"%@",num);
 } completed:^{  //     
     NSLog(@"done");
 }];

Result:
2017-08-21 15:30:24.419852+0800 ReactiveCocoaDemo[310:36453] 1
2017-08-21 15:30:24.420186+0800 ReactiveCocoaDemo[310:36453] done


7、skip操作
takeに対応して、takeは上位のvalueをどれだけ取るかを理解することができ、skipは上位のvalueをスキップすることを意味する.
NSArray *array = @[@1, @2, @3, @4, @5]; //      
[[[array.rac_sequence signalWithScheduler:RACScheduler.mainThreadScheduler] //                    
  skip:2] //     value
 subscribeNext:^( NSNumber *num) { //          next   
     NSLog(@"%@",num);
 } completed:^{  //     
     NSLog(@"done");
 }];

Result:
2017-08-21 15:35:17.137181+0800 ReactiveCocoaDemo[314:37812] 3
2017-08-21 15:35:17.137516+0800 ReactiveCocoaDemo[314:37812] 4
2017-08-21 15:35:17.137778+0800 ReactiveCocoaDemo[314:37812] 5
2017-08-21 15:35:17.138075+0800 ReactiveCocoaDemo[314:37812] done

8、return操作
returnは、他の値と結合し、コンテキストにいくつかのデータを伝達するために主に適用される信号を1つの値で迅速に作成することができます.
RACSignal *numSignal = [RACSignal return:@"Hello"];
[numSignal subscribeNext:^(id  _Nullable x) {
    NSLog(@"%@",x);
} completed:^{
    NSLog(@"%@",@"done");
}];

Result:
2017-08-21 15:05:23.923483+0800 ReactiveCocoaDemo[295:30109] Hello
2017-08-21 15:05:23.923722+0800 ReactiveCocoaDemo[295:30109] done


9、ignore操作
名前の通りignoreは指定されたvalueを無視し、複数のvalueを無視するために複数のvalueを直列に接続できます.
NSArray *numArray = @[@1, @2, @3, @4, @5];//         
[[[[numArray.rac_sequence signalWithScheduler:RACScheduler.mainThreadScheduler] //      
ignore:@2] //    2   
ignore:@3] //    3   
subscribeNext:^(NSNumber *x) {
    NSLog(@"%@",x);
} completed:^{
    NSLog(@"%@",@"done");
}];

Result:
2017-08-22 10:09:18.975972+0800 ReactiveCocoaDemo[474:94852] 1
2017-08-22 10:09:18.977223+0800 ReactiveCocoaDemo[474:94852] 4
2017-08-22 10:09:18.977714+0800 ReactiveCocoaDemo[474:94852] 5
2017-08-22 10:09:18.978108+0800 ReactiveCocoaDemo[474:94852] done

2&3は無視されました
10、mapReplace操作
すべてのnextイベントで送信されたvalueを指定したvalueに置き換えます.
NSArray *numArray = @[@1, @2, @3, @4, @5];//         
[[[numArray.rac_sequence signalWithScheduler:RACScheduler.mainThreadScheduler] //      
mapReplace:@10] //      10
subscribeNext:^(NSNumber *x) {
    NSLog(@"%@",x);
} completed:^{
    NSLog(@"%@",@"done");
}];

Result: 
2017-08-22 10:11:28.525898+0800 ReactiveCocoaDemo[479:95690] 10
2017-08-22 10:11:28.526540+0800 ReactiveCocoaDemo[479:95690] 10
2017-08-22 10:11:28.526869+0800 ReactiveCocoaDemo[479:95690] 10
2017-08-22 10:11:28.527160+0800 ReactiveCocoaDemo[479:95690] 10
2017-08-22 10:11:28.527446+0800 ReactiveCocoaDemo[479:95690] 10
2017-08-22 10:11:28.527875+0800 ReactiveCocoaDemo[479:95690] done