5.RAC值之RACCommand

RACCommand一般用來處理事件,監(jiān)聽按鈕點擊,網(wǎng)絡請求等。
先看下RACCommand簡單使用

RACCommand的使用很簡單,就兩步
1:創(chuàng)建命令
RACCommand *command = [[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {
       // 這里必須返回一個信號,不能返回為nil,會崩潰
       // 如果不想傳遞信號,可以發(fā)出空信號 [RACSignal empty];

       // block調用時刻: [command execute:@1];
       NSLog(@"請求網(wǎng)絡數(shù)據(jù)%@",input);
       
      // 請求網(wǎng)絡數(shù)據(jù)完畢,怎么將網(wǎng)絡產(chǎn)生的數(shù)據(jù)發(fā)送出去呢?
      // 怎么發(fā)送? 就得靠下面這個RACSignal去發(fā)送,只要有人訂閱了RACSignal,RACSignal數(shù)據(jù)就發(fā)送得出去
       return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            [subscriber sendNext:@"發(fā)送網(wǎng)絡數(shù)據(jù)”];
            //如果不再繼續(xù)發(fā)送數(shù)據(jù),要發(fā)送完成信號
            [subscriber sendCompleted];
             return nil;
        }];
}];
2:執(zhí)行命令
[command execute:@1];

如何訂閱命令中的RACSignal信號呢?
有三種方法

  • 方法一,最簡單的一種
    你們查看 execute: 方法,它返回的就是一個RACSignal
- (RACSignal *)execute:(id)input

所以,我們可以直接訂閱這個返回來的RACSignal

RACSignal *signal = [command execute:@1];
[signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x); 
}];
  • 方法二,稍微復雜點
    RACCommand 中有個屬性executionSignals,它表示信號中的信號。
    對了,這里有個要注意的地方,方法二必須要在執(zhí)行命令execute之前執(zhí)行
// 看打印結果可知,command.executionSignals 拿到的是一個RACSignal
 [command.executionSignals subscribeNext:^(RACSignal * x) {
        NSLog(@"%@",x); // x == RACDynamicSignal
        [x subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        }];
     }];
[command execute:@1];
  • 方法三,高級用法
    switchToLatest 獲取最新發(fā)送的信號,只能用于信號中的信號
[command.executionSignals.switchToLatest subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
[command execute:@1];

RACCommand還有一個比較好用的屬性,executing,它用來監(jiān)聽事件有沒有完成

比如:當你點擊一個按鈕訪問網(wǎng)絡的時候,你總不能每次點的時候都訪問網(wǎng)絡吧,肯定要等網(wǎng)絡處理完成之后才能繼續(xù)點,這個時候,你就可以用到這個屬性

// executing 直接返回一個 RACSignal
@property (nonatomic, strong, readonly) RACSignal<NSNumber *> *executing;

// 監(jiān)聽事件有沒有完成,
    [command.executing subscribeNext:^(NSNumber * _Nullable x) {
        if ([x boolValue] == YES) {
            NSLog(@"當前正在執(zhí)行");
        }
        else {
            NSLog(@"執(zhí)行完成/沒有執(zhí)行");
        }
    }];
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容