ReactiveCocoa學習總結

SherryHawki 8年前發布 | 15K 次閱讀 Objective-C開發 ReactiveCocoa

來自: http://www.cnblogs.com/wujy/p/5177819.html

最近一直斷斷續續學習關于ReactiveCocoa的知識內容,對于它的一些基礎內容將通過本文進行一個總結,主要是一些入門知識

一: RACSignal一些運用

@interface RACSignalTestViewController ()
@property(nonatomic,strong)RACSignal *mySignal,*secondSingl;
@end
-(RACSignal *)mySignal
{
    if (!_mySignal) {
        _mySignal=[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            [subscriber sendNext:@10];
            [subscriber sendCompleted];
            return nil;
        }];
    }

    return _mySignal;
}

-(RACSignal *)secondSingl
{
    if (!_secondSingl) {
        _secondSingl=[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            [subscriber sendNext:@20];
            [subscriber sendCompleted];
            return nil;
        }];
    }
    return _secondSingl;
}

先創建兩個RACSignal的內容;將用于接下來的一些操作

//map運用 返回的值作為next的參數
    [[self.mySignal map:^id(NSNumber *value) {
        return [value integerValue]>5?@"踏浪帥":@"有點小";
    }] subscribeNext:^(NSString *str) {
        NSLog(@"map處理完成的值為:%@",str);
    }];

    //filter:過濾信號,使用它可以獲取滿足條件的信號.
    [[self.mySignal filter:^BOOL(NSNumber *item) {
        return [item integerValue]>5;
    }] subscribeNext:^(NSNumber *x) {
        NSLog(@"filter當前的值%ld",[x integerValue]);
    }];


    //ignore:忽略完某些值的信號.當答合被ignore的值時就不會執行next
    [[self.mySignal ignore:@10] subscribeNext:^(id x) {
        NSLog(@"ignore當前的值:%@",x);
    }];

    //distinctUntilChanged:當上一次的值和當前的值有明顯的變化就會發出信號,否則會被忽略掉。
    [[self.mySignal distinctUntilChanged] subscribeNext:^(id x) {
        NSLog(@"distinctUntilChanged當前的值:%@",x);
    }];

    //take:從開始一共取N次的信號
    //takeLast:取最后N次的信號,前提條件,訂閱者必須調用完成,因為只有完成,就知道總共有多少信號.
    //takeUntil:(RACSignal *):獲取信號直到某個信號執行完成
    //skip:(NSUInteger):跳過幾個信號,不接受。

運行結果:

MobileProject[885:18784] map處理完成的值為:踏浪帥
2016-02-02 16:03:07.643 MobileProject[885:18784] filter當前的值10
2016-02-02 16:03:07.644 MobileProject[885:18784] distinctUntilChanged當前的值:10

1.2:一些組合的操作

//concat:按一定順序拼接信號,當多個信號發出的時候,有順序的接收信號
    RACSignal *concatSignal=[self.mySignal concat:self.secondSingl];
    [concatSignal subscribeNext:^(id x) {
        NSLog(@"concat拼接的值:%@",x);
    }];


    //then:用于連接兩個信號,當第一個信號完成,才會連接then返回的信號
    [[self.mySignal then:^RACSignal *{
        @strongify(self);
        return self.secondSingl;
    }] subscribeNext:^(id x) {
        //// 只能接收到第二個信號的值,也就是then返回信號的值
        NSLog(@"then當前的值為:%@",x);
    }];


    //merge:把多個信號合并為一個信號,任何一個信號有新值的時候就會調用
    RACSignal *mergeSignal=[self.mySignal merge:self.secondSingl];
    [mergeSignal subscribeNext:^(id x) {
        NSLog(@"merge當前的值為:%@",x);
    }];


    //combineLatest:將多個信號合并起來,并且拿到各個信號的最新的值,必須每個合并的signal至少都有過一次sendNext,兩個信號的內容合并成一個元組RACTuple,才會觸發合并的信號。
    RACSignal *combineLatestSignal=[self.mySignal combineLatestWith:self.secondSingl];
    [combineLatestSignal subscribeNext:^(id x) {
        NSLog(@"combineLastest當前的值為:%@",x);
    }];


    //zipWith:把兩個信號壓縮成一個信號,只有當兩個信號同時發出信號內容時,并且把兩個信號的內容合并成一個元組RACTuple,才會觸發壓縮流的next事件。
    RACSignal *zipWithSignal=[self.mySignal zipWith:self.secondSingl];
    [zipWithSignal subscribeNext:^(RACTuple *tuple) {
        NSLog(@"zipWith當前的值為:%@",tuple);

        NSLog(@"zipWith中的RACTuple共有幾個值:%ld",tuple.count);

        NSLog(@"zipWith中的RACTuple第一個值為:%@",tuple.first);

        NSLog(@"zipWith中的RACTuple最后一個值為:%@",tuple.last);
    }];


    //reduce聚合:用于信號發出的內容是元組,把信號發出元組的值聚合成一個值 特別是combineLatestWith,zipWith這種返回元組的RACTuple,reduceblcok中的參數,有多少信號組合,reduceblcok就有多少參數,每個參數就是之前信號發出的內容
    RACSignal *reduceSignal=[RACSignal combineLatest:@[self.mySignal,self.secondSingl] reduce:^id(NSNumber *num1 ,NSNumber *num2){
        NSLog(@"combineLastest結合reduct的第一個值為:%ld 第二個值為:%ld",[num1 integerValue],[num2 integerValue]);
        return ([num1 integerValue]>10&&[num2 integerValue]>15)?@"兩個都符合要求":@"都沒有答合要求";
    }];
    [reduceSignal subscribeNext:^(id x) {
        NSLog(@"reduce當前的值為:%@",x);
    }];

運行結果:

MobileProject[885:18784] concat拼接的值:10
2016-02-02 16:03:07.645 MobileProject[885:18784] concat拼接的值:20
2016-02-02 16:03:07.646 MobileProject[885:18784] then當前的值為:20
2016-02-02 16:03:07.646 MobileProject[885:18784] merge當前的值為:10
2016-02-02 16:03:07.646 MobileProject[885:18784] merge當前的值為:20
2016-02-02 16:03:07.647 MobileProject[885:18784] combineLastest當前的值為:<RACTuple: 0x7ff5ca606860> (
    10,
    20
)
2016-02-02 16:03:07.648 MobileProject[885:18784] zipWith當前的值為:<RACTuple: 0x7ff5ca60ab80> (
    10,
    20
)
2016-02-02 16:03:07.648 MobileProject[885:18784] zipWith中的RACTuple共有幾個值:2
2016-02-02 16:03:07.648 MobileProject[885:18784] zipWith中的RACTuple第一個值為:10
2016-02-02 16:03:07.648 MobileProject[885:18784] zipWith中的RACTuple最后一個值為:20
2016-02-02 16:03:07.649 MobileProject[885:18784] combineLastest結合reduct的第一個值為:10 第二個值為:20
2016-02-02 16:03:07.720 MobileProject[885:18784] reduce當前的值為:都沒有答合要求

1.3:其它一些操作:

//doNext: 執行Next之前,會先執行這個Block,可以做一些初使化的功能,doCompleted: 執行sendCompleted之前,會先執行這個Block
    [[[self.mySignal doNext:^(id x) {
        NSLog(@"doNext當前的值:%@",x);
    }] doCompleted:^{
        NSLog(@"doComplete 執行到了");
    }] subscribeNext:^(id x) {
        NSLog(@"測試doNext,doComplete的值:%@",x);
    }];

    //switchToLatest:用于signalOfSignals(信號的信號),有時候信號也會發出信號,會在signalOfSignals中,獲取signalOfSignals發送的最新信號。
    RACSubject *signalOfSignals = [RACSubject subject];
    RACSubject *signal = [RACSubject subject];

    // 獲取信號中信號最近發出信號,訂閱最近發出的信號。
    // 注意switchToLatest:只能用于信號中的信號
    [signalOfSignals.switchToLatest subscribeNext:^(id x) {

        NSLog(@"switchToLatest%@",x);
    }];
    [signalOfSignals sendNext:signal];
    [signal sendNext:@1];

    //deliverOn: 內容傳遞切換到制定線程中,副作用在原來線程中,把在創建信號時block中的代碼稱之為副作用。
    //subscribeOn: 內容傳遞和副作用都會切換到制定線程中。'


    //timeout:超時,可以讓一個信號在一定的時間后,自動報錯。
    [[self.mySignal timeout:1 onScheduler:[RACScheduler currentScheduler]]
     subscribeNext:^(id x) {
         NSLog(@"timeout當前的值:%@",x);
     } error:^(NSError *error) {
         NSLog(@"timeout 超時了");
     }];


    //delay 延遲發送next。
    [[self.mySignal delay:2] subscribeNext:^(id x) {
        NSLog(@"delay執行%@",x);
    }];


    //retry重試 :只要失敗,就會重新執行創建信號中的block,直到成功.
    __block int i = 0;
    [[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {

        if (i == 10) {
            [subscriber sendNext:@100];
        }else{
            NSLog(@"接收到錯誤");
            [subscriber sendError:nil];
        }
        i++;

        return nil;

    }] retry] subscribeNext:^(id x) {

        NSLog(@"retry當前的值:%@",x);

    } error:^(NSError *error) {

    }];


    //普通執行多次訂閱
    RACSignal *oneSignal = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@1];
        [subscriber sendNext:@2];
        return nil;
    }] replay];
    [oneSignal subscribeNext:^(id x) {
        NSLog(@"第一個沒有replay執行的內容:%@",x);
    }];
    [oneSignal subscribeNext:^(id x) {
        NSLog(@"第二個沒有replay執行的內容:%@",x);
    }];


    //replay重放:當一個信號被多次訂閱,反復播放內容
    RACSignal *replaySignal = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@1];
        [subscriber sendNext:@2];
        return nil;
    }] replay];

    [replaySignal subscribeNext:^(id x) {
        NSLog(@"replay第一個訂閱者%@",x);
    }];

    [replaySignal subscribeNext:^(id x) {
        NSLog(@"replay第二個訂閱者%@",x);
    }];


    //interval 定時:每隔一段時間發出信號
    [[RACSignal interval:1 onScheduler:[RACScheduler currentScheduler]] subscribeNext:^(id x) {
        NSLog(@"interval一直在執行:%@",x);
    }];

    //throttle節流:當某個信號發送比較頻繁時,可以使用節流,在某一段時間不發送信號內容,過了一段時間獲取信號的最新內容發出。

運行結果:

2016-02-02 16:03:07.720 MobileProject[885:18784] doNext當前的值:10
2016-02-02 16:03:07.720 MobileProject[885:18784] 測試doNext,doComplete的值:10
2016-02-02 16:03:07.721 MobileProject[885:18784] doComplete 執行到了
2016-02-02 16:03:07.721 MobileProject[885:18784] switchToLatest1
2016-02-02 16:03:07.722 MobileProject[885:18784] timeout當前的值:10
2016-02-02 16:03:07.722 MobileProject[885:18784] 接收到錯誤
2016-02-02 16:03:07.723 MobileProject[885:18784] 第一個沒有replay執行的內容:1
2016-02-02 16:03:07.723 MobileProject[885:18784] 第一個沒有replay執行的內容:2
2016-02-02 16:03:07.723 MobileProject[885:18784] 第二個沒有replay執行的內容:1
2016-02-02 16:03:07.723 MobileProject[885:18784] 第二個沒有replay執行的內容:2
2016-02-02 16:03:07.724 MobileProject[885:18784] replay第一個訂閱者1
2016-02-02 16:03:07.724 MobileProject[885:18784] replay第一個訂閱者2
2016-02-02 16:03:07.724 MobileProject[885:18784] replay第二個訂閱者1
2016-02-02 16:03:07.724 MobileProject[885:18784] replay第二個訂閱者2
2016-02-02 16:03:07.838 MobileProject[885:18784] 接收到錯誤
2016-02-02 16:03:07.838 MobileProject[885:18784] 接收到錯誤
2016-02-02 16:03:07.838 MobileProject[885:18784] 接收到錯誤
2016-02-02 16:03:07.838 MobileProject[885:18784] 接收到錯誤
2016-02-02 16:03:07.839 MobileProject[885:18784] 接收到錯誤
2016-02-02 16:03:07.865 MobileProject[885:18784] 接收到錯誤
2016-02-02 16:03:07.865 MobileProject[885:18784] 接收到錯誤
2016-02-02 16:03:07.865 MobileProject[885:18784] 接收到錯誤
2016-02-02 16:03:07.866 MobileProject[885:18784] 接收到錯誤
2016-02-02 16:03:07.866 MobileProject[885:18784] retry當前的值:100
2016-02-02 16:03:08.726 MobileProject[885:18784] interval一直在執行:2016-02-02 08:03:08 +0000
2016-02-02 16:03:09.724 MobileProject[885:18784] delay執行10
2016-02-02 16:03:09.725 MobileProject[885:18784] interval一直在執行:2016-02-02 08:03:09 +0000
2016-02-02 16:03:10.726 MobileProject[885:18784] interval一直在執行:2016-02-02 08:03:10 +0000
2016-02-02 16:03:11.724 MobileProject[885:18784] interval一直在執行:2016-02-02 08:03:11 +0000
2016-02-02 16:03:12.727 MobileProject[885:18784] interval一直在執行:2016-02-02 08:03:12 +0000
2016-02-02 16:03:13.725 MobileProject[885:18784] interval一直在執行:2016-02-02 08:03:13 +0000
2016-02-02 16:03:14.730 MobileProject[885:18784] interval一直在執行:2016-02-02 08:03:14 +0000
2016-02-02 16:03:15.726 MobileProject[885:18784] interval一直在執行:2016-02-02 08:03:15 +0000

二:關于 RACCommand的一些知識

@interface TestRacViewController ()
@property(nonatomic,strong)UITextField *userNameText;
@property(strong,nonatomic)NSString *username;
@property(nonatomic,strong)UIButton *loginButton,*racCommendButton,*errCommendButton,*mainThreadButton,*netWorkButton,*testButton;

@property(nonatomic,strong)RACCommand *otherMyRaccomand,*mainThreadCommend,*netWorkCommend,*testPropertyCommend;
@end
//布局
-(void)loadPage
{
    if (!self.userNameText) {
        self.userNameText=[[UITextField alloc]init];
        self.userNameText.backgroundColor=[UIColor whiteColor];
        self.userNameText.placeholder=@"輸入用戶名";
        [self.view addSubview:self.userNameText];
        [self.userNameText mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.mas_equalTo(self.view.mas_left).with.offset(15);
            make.top.mas_equalTo(self.view.mas_top).with.offset(70);
            make.right.mas_equalTo(self.view.mas_right).with.offset(-15);
            make.height.mas_equalTo(@40);
        }];
    }

    if(!self.loginButton)
    {
        self.loginButton=[[UIButton alloc]init];
        [self.loginButton setTitle:@"響應" forState:UIControlStateNormal];
        self.loginButton.backgroundColor=[UIColor blueColor];
        [self.view addSubview:self.loginButton];
        [self.loginButton mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.mas_equalTo(self.view.mas_left).with.offset(15);
            make.top.mas_equalTo(self.userNameText.mas_bottom).with.offset(20);
            make.right.mas_equalTo(self.view.mas_right).with.offset(-15);
            make.height.mas_equalTo(@40);
        }];
    }

    if(!self.racCommendButton)
    {
        self.racCommendButton=[[UIButton alloc]init];
        [self.racCommendButton setTitle:@"RacCommend測試" forState:UIControlStateNormal];
        self.racCommendButton.backgroundColor=[UIColor blueColor];
        [self.view addSubview:self.racCommendButton];
        [self.racCommendButton mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.mas_equalTo(self.view.mas_left).with.offset(15);
            make.top.mas_equalTo(self.loginButton.mas_bottom).with.offset(20);
            make.right.mas_equalTo(self.view.mas_right).with.offset(-15);
            make.height.mas_equalTo(@40);
        }];
    }

    if(!self.errCommendButton)
    {
        self.errCommendButton=[[UIButton alloc]init];
        [self.errCommendButton setTitle:@"ERROR測試" forState:UIControlStateNormal];
        self.errCommendButton.backgroundColor=[UIColor blueColor];
        [self.view addSubview:self.errCommendButton];
        [self.errCommendButton mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.mas_equalTo(self.view.mas_left).with.offset(15);
            make.top.mas_equalTo(self.racCommendButton.mas_bottom).with.offset(20);
            make.right.mas_equalTo(self.view.mas_right).with.offset(-15);
            make.height.mas_equalTo(@40);
        }];
    }

    if(!self.mainThreadButton)
    {
        self.mainThreadButton=[[UIButton alloc]init];
        [self.mainThreadButton setTitle:@"主線程上運行" forState:UIControlStateNormal];
        self.mainThreadButton.backgroundColor=[UIColor blueColor];
        [self.view addSubview:self.mainThreadButton];
        [self.mainThreadButton mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.mas_equalTo(self.view.mas_left).with.offset(15);
            make.top.mas_equalTo(self.errCommendButton.mas_bottom).with.offset(20);
            make.right.mas_equalTo(self.view.mas_right).with.offset(-15);
            make.height.mas_equalTo(@40);
        }];
    }

    if(!self.netWorkButton)
    {
        self.netWorkButton=[[UIButton alloc]init];
        [self.netWorkButton setTitle:@"屬性測試" forState:UIControlStateNormal];
        self.netWorkButton.backgroundColor=[UIColor blueColor];
        [self.view addSubview:self.netWorkButton];
        [self.netWorkButton mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.mas_equalTo(self.view.mas_left).with.offset(15);
            make.top.mas_equalTo(self.mainThreadButton.mas_bottom).with.offset(20);
            make.right.mas_equalTo(self.view.mas_right).with.offset(-15);
            make.height.mas_equalTo(@40);
        }];
    }

    if(!self.testButton)
    {
        self.testButton=[[UIButton alloc]init];
        [self.testButton setTitle:@"測試特性" forState:UIControlStateNormal];
        self.testButton.backgroundColor=[UIColor blueColor];
        [self.view addSubview:self.testButton];
        [self.testButton mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.mas_equalTo(self.view.mas_left).with.offset(15);
            make.top.mas_equalTo(self.netWorkButton.mas_bottom).with.offset(20);
            make.right.mas_equalTo(self.view.mas_right).with.offset(-15);
            make.height.mas_equalTo(@40);
        }];
    }
}

一些定義

//創建一個信號代碼
-(RACSignal *)testSignal
{
    RACSignal *signal = [RACSignal createSignal:^ RACDisposable * (id<RACSubscriber> subscriber) {
        NSLog(@"創建信號");
        [subscriber sendNext:@"Hi 我是一個信號"];
        [subscriber sendCompleted];
        return nil;
    }];
    return signal;
}

//創建一個命令響應
-(RACCommand *)testCommend
{
    @weakify(self);
    RACCommand *myCommend=[[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
        RACSignal *authSignal=[RACSignal empty];
        @strongify(self);

                  authSignal=[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
                      //可以根據要求加條件進行判斷是否創建信號
                      if ([self.username isEqualToString:@"wjy"]) {
                      NSLog(@"符合要求");
                      [subscriber sendNext:@"我完成的命令響應"];
                      [subscriber sendCompleted];
                      }
                      else
                      {
                          //錯誤
                          [subscriber sendError:[NSError errorWithDomain:@"報錯了" code:1 userInfo:nil]];
                      }
                  return nil;
            }];
        //materialize是為了處理拿不到error的問題
        return [authSignal materialize];
    }];

    return myCommend;
}

//創建屬性的RACCommand
-(RACCommand *)otherMyRaccomand
{
    if (!_otherMyRaccomand) {
        _otherMyRaccomand=[[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
            NSLog(@"執行到新的RACCommand");
            RACSignal *otherSignal=[RACSignal empty];
            otherSignal=[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
                if ([self.username isEqualToString:@"wjy"]) {
                    [subscriber sendNext:@"我肯定可以運行的"];
                    [subscriber sendCompleted];
                }
                else
                {
                    [subscriber sendError:[NSError errorWithDomain:@"報錯了" code:401 userInfo:nil]];
                }
                return nil;
            }];
            return otherSignal;
        }];
    }
    return _otherMyRaccomand;
}


//創建主線程上運行
-(RACCommand *)mainThreadCommend
{
    @weakify(self);
    if (!_mainThreadCommend) {
    _mainThreadCommend=[[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
        RACSignal *authSignal=[RACSignal empty];
        @strongify(self);

        authSignal=[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            @strongify(self);
            //可以根據要求加條件進行判斷是否創建信號
            if ([self.username isEqualToString:@"wjy"]) {
                [subscriber sendNext:@(YES)];
                [subscriber sendCompleted];
            }
            else
            {
                //錯誤
                [subscriber sendError:[NSError errorWithDomain:@"報錯了" code:1 userInfo:nil]];
            }
            return nil;
        }];
        return authSignal;
    }];
    }
    return _mainThreadCommend;
}


//特性測試
-(RACCommand *)testPropertyCommend
{
    if (!_testPropertyCommend) {

    }

    return _testPropertyCommend;
}

-(RACSignal *)nettestSignal
{
    RACSignal *authSignal=[RACSignal empty];

    authSignal=[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        LogInApi *reg = [[LogInApi alloc] initWithUsername:self.username password:@"123456"];
        [reg startWithCompletionBlockWithSuccess:^(YTKBaseRequest *request) {
            LoginModel *model=[[LoginModel alloc]initWithString:request.responseString error:nil];
            [subscriber sendNext:model];
            [subscriber sendCompleted];
        } failure:^(YTKBaseRequest *request) {
            [subscriber sendError:[NSError errorWithDomain:@"報錯了" code:1 userInfo:nil]];
        }];
        return nil;
    }];
    return authSignal;
}

-(RACSignal *)netSignal
{
    RACSignal *authSignal=[RACSignal empty];
    authSignal=[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@"測試"];
        [subscriber sendCompleted];

        return nil;
    }];
    return authSignal;
}

//RACSubject的運用
-(RACSubject *)testSubject
{
    RACSubject *sub=[RACSubject subject];
    [sub sendNext:@"我是RACSubject"];
    return sub;
}

運用的內容:

[self loadPage];

    @weakify(self);

    //把左邊的屬性跟右邊信號signal的sendNext值綁定  distinctUntilChanged為了當值相同時不執行
    RAC(self,username)=[self.userNameText.rac_textSignal distinctUntilChanged];

    //監聽username是否有變化,有變化就會執行subscribeNext 這個屬性要支持KVO  可變數組就不可以
    [RACObserve(self, username) subscribeNext:^(NSString *x) {
        NSLog(@"你當前輸入的值為:%@",x);
    }];

    //UIAlertView跟RAC結合
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"" message:@"Alert" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"確定", nil];
    [[alertView rac_buttonClickedSignal] subscribeNext:^(NSNumber *indexNumber) {
        if ([indexNumber intValue] == 1) {
            NSLog(@"你點了確定");
        } else {
            NSLog(@"你點了取消");
        }
    }];
    [alertView show];

    //Button響應事件
    [[self.loginButton
      rac_signalForControlEvents:UIControlEventTouchUpInside]
        subscribeNext:^(UIButton *x) {
         @strongify(self);
         [[self testSignal] subscribeNext:^(id x) {
             NSLog(@"當前執行值為:%@",x);
         }];
     }];



    //Button用命令式運行 switchToLatest處理信號中傳遞的參數為信號
    self.racCommendButton.rac_command=[self testCommend];

    //這個綁定要放在executionSignals執行前面 否則只會有一個執行完成會響應
    [self.racCommendButton.rac_command.executing subscribeNext:^(id x) {
        if ([x boolValue]) {
            NSLog(@"rac_command正在執行中");
        }
        else
        {
            NSLog(@"rac_command執行完成");
        }
    }];

    //dematerialize處理可以響應處理跟完成的內容
    [self.racCommendButton.rac_command.executionSignals subscribeNext:^(RACSignal *execution) {
        [[[execution dematerialize] deliverOn:[RACScheduler mainThreadScheduler]] subscribeNext:^(id x) {
            NSLog(@"提示內容:%@",x);
        } error:^(NSError *error) {
             NSLog(@"racCommend出錯了");
        }];
    }];


    //關于otherMyRaccomand的方式
    self.errCommendButton.rac_command=self.otherMyRaccomand;

    [self.otherMyRaccomand.executionSignals.switchToLatest subscribeNext:^(id x) {
        NSLog(@"完成了 %@",x);
    }];

    //這邊要注意是在errors 里面執行subscribeNext   不是執行subscribeError
    [self.otherMyRaccomand.errors subscribeNext:^(NSError *error) {
        NSLog(@"出錯了 %@",error);
    }];


    //主線程上操作
    self.mainThreadButton.rac_command=self.mainThreadCommend;
    [[[self.mainThreadCommend.executionSignals.switchToLatest map:^id(id value) {
        if ([value boolValue]) {
            return @"跳浪帥";
        }
        else
        {
            return @"出太陽好么";
        }
    }] deliverOn:[RACScheduler mainThreadScheduler]] subscribeNext:^(NSString *str) {
        UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"我是彈出窗" message:[NSString stringWithFormat:@"%@",str] delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"確定", nil];
        [alert show];
    }];

    //網絡請求
    //Button響應事件
    [[self.netWorkButton
      rac_signalForControlEvents:UIControlEventTouchUpInside]
     subscribeNext:^(id x) {
         [[[self netSignal] flattenMap:^RACStream *(id value) {
              return [RACReturnSignal return:[NSString stringWithFormat:@"%@ 我已經被改變了成為另外一個信號",value]];
         }]
         subscribeNext:^(id x) {
             NSLog(@"輸出的內容:%@",x);
         }];

     }];

因為代碼中已經有相應的注解,所以文字說明就比較少,若有不明白可以留言;

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