簡介: RAC 指的就是 RactiveCocoa ,是 Github 的一個開源框架,能夠幫我們提供大量方便的事件處理方案,讓我們更簡單粗暴地去處理事件,現在分為 ReactiveObjC 和 ReactiveSwift ,兩個框架的功能使用相似. RAC 的核心思想:創建信號 - 訂閱信號 - ...
簡介:
RAC
指的就是 RactiveCocoa
,是 Github
的一個開源框架,能夠幫我們提供大量方便的事件處理方案,讓我們更簡單粗暴地去處理事件,現在分為 ReactiveObjC
和 ReactiveSwift
,兩個框架的功能使用相似.
RAC
的核心思想:創建信號
- 訂閱信號
- 發送信號.
1. RACSignal 信號(主線程中執行)
1 // 創建信號 2 RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) { 3 // 發送信號 4 [subscriber sendNext:@"發送信號"]; 5 return nil; 6 }]; 7 8 /* 訂閱信號 */ 9 RACDisposable *disposable = [signal subscribeNext:^(id _Nullable x) { 10 11 NSLog(@"信號內容:%@", x); 12 }]; 13 14 // 取消訂閱 15 [disposable dispose];
結果:
2. RACSubject 信號(主線程中執行)
通常用來代替代理,有了它,就不必要定義代理了。
1 // 創建信號 2 RACSubject *subject = [RACSubject subject]; 3 // 訂閱信號(通常在別的視圖控制器中訂閱,與代理的用法類似 4 [subject subscribeNext:^(id _Nullable x) { 5 NSLog(@"信號內容:%@", x); 6 }]; 7 [subject subscribeNext:^(id _Nullable x) { 8 // block調用時刻:當信號發出新值,就會調用. 9 NSLog(@"第二個訂閱者%@",x); 10 }]; 11 // 發送信號 12 [subject sendNext:@"發送信號"];
結果:
3. RACTuple 元組(主線程中執行)
RAC
的元祖,跟我們 OC
的數組其實是一樣的,它其實就是封裝了我們 OC
的數組。
3.1
1 // 把值包裝成 元組 2 RACTuple * tuple = RACTuplePack(@"abc",@"def",@"ghj"); 3 // 解析元組 4 // RACTupleUnpack(NSString * a , NSString * b , NSString * c) = tuple ; 5 NSLog(@"RACTuple 元組包裝: pack = %@ ",tuple);
結果:
3.2 NSDictionary 元組 , 將字典裡面的每一對 keyValue 列舉出來(開了一個新的線程,非同步列舉)
1 NSDictionary * dicTuple = @{@"name":@"Jakey" , @"age":@18 , @"student":@(YES)}; 2 [dicTuple.rac_sequence.signal subscribeNext:^(id _Nullable x) { 3 NSString * key = [(RACTuple *)x objectAtIndex:0]; 4 id value = [(RACTuple *)x objectAtIndex:1]; 5 NSLog(@"NSDictionary 元組使用 = %@ , key = %@ , value = %@ , thread = %@",x,key,value,[NSThread currentThread]); 6 }completed:^{ 7 NSLog(@"NSDictionary 元組使用 completed , thread = %@",[NSThread currentThread]); 8 } ];
結果:
3.3 NSArray 元組 ,將數組內的所有數據列舉出來 (非同步列舉)
1 NSArray * array = @[@"klr",@"nop",@"rst"]; 2 [array.rac_sequence.signal subscribeNext:^(id _Nullable x) { 3 NSLog(@"NSArray 元組 x = %@ , thread = %@",x,[NSThread currentThread]); 4 }error:^(NSError * _Nullable error) { 5 NSLog(@"NSArray 元組 error = %@",error); 6 } completed:^{ 7 NSLog(@"NSArray 元組 completed ,thread = %@",[NSThread currentThread]); 8 }];
結果:
3.4 非同步列出 數組 或 字典 內容
1 NSArray * array = @[@"重裝炮台111111111",@"追擊潛能222222222222",@"警戒地雷333333333"]; 2 NSArray * mapArray = [[array.rac_sequence map:^id _Nullable(id _Nullable value) { 3 NSLog(@"value = %@ , thread = %@",value,[NSThread currentThread]); 4 return [value stringByAppendingString:@" temp"]; 5 }] array] ; 6 NSLog(@"===== %@", mapArray);
結果:
4. RACReplaySubject 先發送 再訂閱(主線程中執行)
先發送 再訂閱 (這個比較 實用 ,可以在不知道什麼時候發送信號的情況下準確的接收到信號)(主線程中執行)
1 // Capacity 事先預指訂閱的個數,裡面是動太數組 2 RACReplaySubject * replaySubject = [RACReplaySubject replaySubjectWithCapacity:2]; 3 4 // 發送 5 [replaySubject sendNext:@"RACReplaySubjectDome 先發送 1"]; 6 [replaySubject sendNext:@"RACReplaySubjectDome 先發送 2"]; 7 [replaySubject sendCompleted]; 8 9 // 訂閱 10 [replaySubject subscribeNext:^(id _Nullable x) { 11 NSLog(@"subscribeNext:x = %@ error completed , thread = %@",x,[NSThread currentThread]); 12 } error:^(NSError * _Nullable error) { 13 NSLog(@"error = %@ , thread = %@",error,[NSThread currentThread]); 14 } completed:^{ 15 NSLog(@"completed ! , thread = %@",[NSThread currentThread]); 16 }]; 17 18 // 延時訂閱,一樣可以接收到信號 19 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 20 [replaySubject subscribeNext:^(id _Nullable x) { 21 22 NSLog(@"subscribeNext: x = %@, thread = %@",x,[NSThread currentThread]); 23 }]; 24 });
結果: