RACCommand一般用來處理事件,監聽按鈕點擊,網絡請求等。
先看下RACCommand簡單使用
RACCommand的使用很簡單,就兩步
1:創建命令
RACCommand *command = [[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id _Nullable input) {
// 這里必須返回一個信號,不能返回為nil,會崩潰
// 如果不想傳遞信號,可以發出空信號 [RACSignal empty];
// block調用時刻: [command execute:@1];
NSLog(@"請求網絡數據%@",input);
// 請求網絡數據完畢,怎么將網絡產生的數據發送出去呢?
// 怎么發送? 就得靠下面這個RACSignal去發送,只要有人訂閱了RACSignal,RACSignal數據就發送得出去
return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"發送網絡數據”];
//如果不再繼續發送數據,要發送完成信號
[subscriber sendCompleted];
return nil;
}];
}];
2:執行命令
[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,它表示信號中的信號。
對了,這里有個要注意的地方,方法二必須要在執行命令execute之前執行
// 看打印結果可知,command.executionSignals 拿到的是一個RACSignal
[command.executionSignals subscribeNext:^(RACSignal * x) {
NSLog(@"%@",x); // x == RACDynamicSignal
[x subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
}];
[command execute:@1];
- 方法三,高級用法
switchToLatest 獲取最新發送的信號,只能用于信號中的信號
[command.executionSignals.switchToLatest subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
[command execute:@1];
RACCommand還有一個比較好用的屬性,executing,它用來監聽事件有沒有完成
比如:當你點擊一個按鈕訪問網絡的時候,你總不能每次點的時候都訪問網絡吧,肯定要等網絡處理完成之后才能繼續點,這個時候,你就可以用到這個屬性
// executing 直接返回一個 RACSignal
@property (nonatomic, strong, readonly) RACSignal<NSNumber *> *executing;
// 監聽事件有沒有完成,
[command.executing subscribeNext:^(NSNumber * _Nullable x) {
if ([x boolValue] == YES) {
NSLog(@"當前正在執行");
}
else {
NSLog(@"執行完成/沒有執行");
}
}];