ReactiveCocoa

DomKellow 8年前發布 | 8K 次閱讀 Objective-C開發

來自: http://my.oschina.net/u/2346786/blog/614316


1.ReactiveCocoa作用

    在我們iOS開發過程中,當某些事件響應的時候,需要處理某些業務邏輯,這些事件都用不同的方式來處理。比如按鈕的點擊使用action,ScrollView滾動使用delegate,屬性值改變使用KVO等系統提供的方式。其實這些事件,都可以通過RAC處理。


2.RACSiganl

    RACSiganl:信號類,只是表示當數據改變時,信號內部會發出數據,它本身不具備發送信號的能力,而是交給內部一個訂閱者去發出。

    RACSubscriber:表示訂閱者的意思,用于發送信號,這是一個協議,不是一個類,只要遵守這個協議,并且實現方法才能成為訂閱者。通過create創建的信號,都有一個訂閱者,幫助他發送數據。

    RACDisposable:用于取消訂閱或者清理資源,當信號發送完成或者發送錯誤的時候,就會自動觸發它。

    //1.創建信號
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        //block調用時刻:每當有訂閱者訂閱信號,就會調用block
        
        //2.發送信號
        [subscriber sendNext:@1];
        
        //如果不再發送數據,最好發送信號完成,內部會自動調用[RACDisposable disposable]取消訂閱
        [subscriber sendCompleted];
        
        return [RACDisposable disposableWithBlock:^{
            //block調用時刻:當信號發送完成或者發送錯誤,就會自動執行這個block,取消訂閱
            NSLog(@"信號被銷毀");
        }];
    }];
    
    
    //3.訂閱信號
    [signal subscribeNext:^(id x) {
        //block調用時刻:每當有信號發送數據,就會調用該方法
        NSLog(@"接收到的數據:%@",x);
    }];

 

3.RACSubject與RACReplaySubject

     RACSubject:信號提供者,自己可以充當信號,又能發送信號。subject可以想成是signal的變體,就像NSMutableArray相對于NSArray?一樣。它們是非RAC的代碼和RAC代碼之間的橋梁。

    RACReplaySubject:重復提供信號類,RACSubject的子類。

    RACReplaySubject與RACSubject區別:

         1).RACReplaySubject可以先發送信號,再訂閱信號,RACSubject就不可以。

         2).可以設置capacity數量來限制緩存的value的數量,即只緩充最新的幾個值。

    //1.創建信號
    RACSubject *subject = [RACSubject subject];
    
    //2.訂閱信號
    [subject subscribeNext:^(id x) {
        //block調用時刻:當信號發出新值,就會調用
        NSLog(@"第一個訂閱者%@",x);
    }];
    [subject subscribeNext:^(id x) {
        //block調用時刻:當信號發出新值,就會調用
        NSLog(@"第二個訂閱者%@",x);
    }];
    
    //3.發送信號
    [subject sendNext:@"1"];
    
  
    
      //1.創建信號
    RACReplaySubject *replaySubject = [RACReplaySubject subject];
   // RACReplaySubject *replaySubject = [RACReplaySubject replaySubjectWithCapacity:0];
    
    //2.發送信號
    [replaySubject sendNext:@1];
    [replaySubject sendNext:@2];
    
    //3.訂閱信號
    [replaySubject subscribeNext:^(id x) {
        NSLog(@"第一個訂閱者%@",x);
    }];
    [replaySubject subscribeNext:^(id x) {
        NSLog(@"第二個訂閱者%@",x);
    }];

    RACSubject替代代理

情景:跳轉到另一個vc,TwoVC發送通知,VC收到回調的通知

VC
- (IBAction)click:(UIButton *)sender {

    TwoViewController *twoVC = [[TwoViewController alloc] init];
    
    //設置代理信號
    twoVC.delegateSubject = [RACSubject subject];
    
    //訂閱代理信號
    [twoVC.delegateSubject subscribeNext:^(id x) {
        NSLog(@"點擊了通知按鈕,%@",x);
    }];
    
    //跳轉
    [self presentViewController:twoVC animated:YES completion:nil];

}

TwoVC
    if (self.delegateSubject) {
        //發送信號
        [self.delegateSubject sendNext:@"已跳轉到TwoVC"];
    }

 

 本文由用戶 DomKellow 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!