- (IBAction)test:(id)sender {
? ? [selftest5];
? ? return;
? ? // RACCommand: 處理事件
? ? // 不能返回空的信號
? ? // 1.創(chuàng)建命令
? ? RACCommand*command = [[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id? _Nullable input) {
?? ? ? //block調(diào)用,直行行命令的時候就會調(diào)用
? ? ? ? NSLog(@"執(zhí)行命令傳進來的參數(shù)==%@",input); // input 為執(zhí)行命令傳進來的參數(shù)
? ? ? ? return [RACSignal createSignal:^RACDisposable * _Nullable(id? _Nonnull subscriber) {
? ? ? ? ? ? [subscribersendNext:@"執(zhí)行命令產(chǎn)生的數(shù)據(jù)"];
? ? ? ? ? ? returnnil;
? ? ? ? }];
? ? }];
? ? // 如何拿到執(zhí)行命令中產(chǎn)生的數(shù)據(jù)呢?
? ? // 訂閱命令內(nèi)部的信號
? ? // ** 方式一:直接訂閱執(zhí)行命令返回的信號
? ? // 2.執(zhí)行命令
? ? RACSignal *signal =[command execute:@{@"key":@2,@"key2":@3}]; // 這里其實用到的是replaySubject 可以先發(fā)送命令再訂閱
? ? // 在這里就可以訂閱信號了
? ? @weakify(self);
? ? [signalsubscribeNext:^(idx) {
? ? ? ? NSLog(@"%@",x);
? ? ? ? @strongify(self);
? ? ? ? self.contentL.text= x;
? ? }];
}
// RACCommand:RAC中用于處理事件的類罕模,可以把事件如何處理,事件中的數(shù)據(jù)如何傳遞霞捡,包裝到這個類中,他可以很方便的監(jiān)控事件的執(zhí)行過程薄疚,比如看事件有沒有執(zhí)行完畢
// 使用場景:監(jiān)聽按鈕點擊,網(wǎng)絡(luò)請求
- (void)viewDidLoad {
? ? [super viewDidLoad];
? ? // Do any additional setup after loading the view.
}
// 方式二:
// 訂閱信號
// 注意:這里必須是先訂閱才能發(fā)送命令
// executionSignals:信號源赊琳,信號中信號街夭,signalofsignals:信號,發(fā)送數(shù)據(jù)就是信號
-(void)test1{
? ? RACCommand*command= [[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id? _Nullable input) {
? ? ? ? NSLog(@"執(zhí)行命令傳進來的參數(shù)==%@",input); // input 為執(zhí)行命令傳進來的參數(shù)
? ? ? ? return [RACSignal createSignal:^RACDisposable * _Nullable(id? _Nonnull subscriber) {
? ? ? ? ? ? [subscribersendNext:@"產(chǎn)生的數(shù)據(jù)"];
? ? ? ? ? ? returnnil;
? ? ? ? }];
? ? }];
? ? @weakify(self);
? ? [command.executionSignals subscribeNext:^(RACSignal? *x) {
? ? ? ? [xsubscribeNext:^(id? _Nullablex) {
? ? ? ? ? ? NSLog(@"%@",x);
? ? ? ? ? ? @strongify(self);
? ? ? ? ? ? self.contentL.text= x;
? ? ? ? }];
? ? }];
? ? // 2.執(zhí)行命令
? ? [commandexecute:@2];
}
// 高級做法
- (void)test3 {
? ? // 1.創(chuàng)建命令
? ? RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
? ? ? ? // block調(diào)用:執(zhí)行命令的時候就會調(diào)用
? ? ? ? NSLog(@"%@", input);
? ? ? ? // 這里的返回值不允許為nil
? ? ? ? return [RACSignal createSignal:^RACDisposable *(id subscriber) {
? ? ? ? ? ? [subscribersendNext:@"發(fā)送信號"];
? ? ? ? ? ? returnnil;
? ? ? ? }];
? ? }];
? ? // 方式三
? ? // switchToLatest獲取最新發(fā)送的信號躏筏,只能用于信號中信號板丽。
? ? [command.executionSignals.switchToLatest subscribeNext:^(id x) {
? ? ? ? NSLog(@"%@", x);
? ? }];
? ? // 2.執(zhí)行命令
? ? [commandexecute:@3];
}
// switchToLatest
- (void)test4 {
? ? // 創(chuàng)建信號中信號
? ? RACSubject*signalofsignals = [RACSubjectsubject];
? ? RACSubject *signalA = [RACSubject subject];
? ? // 訂閱信號
? ? //? ? [signalofsignals subscribeNext:^(RACSignal *x) {
? ? //? ? ? ? [x subscribeNext:^(id x) {
? ? //? ? ? ? ? ? NSLog(@"%@", x);
? ? //? ? ? ? }];
? ? //? ? }];
? ? // switchToLatest: 獲取信號中信號發(fā)送的最新信號
? ? [signalofsignals.switchToLatestsubscribeNext:^(idx) {
? ? ? ? NSLog(@"%@", x);
? ? }];
? ? // 發(fā)送信號
? ? [signalofsignalssendNext:signalA];
? ? [signalAsendNext:@4];
}
// 監(jiān)聽事件有沒有完成
- (void)test5 {
? ? //注意:當前命令內(nèi)部發(fā)送數(shù)據(jù)完成,一定要主動發(fā)送完成
? ? // 1.創(chuàng)建命令
? ? RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
? ? ? ? // block調(diào)用:執(zhí)行命令的時候就會調(diào)用
? ? ? ? NSLog(@"%@", input);
? ? ? ? // 這里的返回值不允許為nil
? ? ? ? return [RACSignal createSignal:^RACDisposable *(id subscriber) {
? ? ? ? ? ? // 發(fā)送數(shù)據(jù)
? ? ? ? ? ? [subscribersendNext:@"執(zhí)行命令產(chǎn)生的數(shù)據(jù)"];
? ? ? ? ? ? // *** 發(fā)送完成 **
? ? ? ? ? ? [subscribersendCompleted];
? ? ? ? ? ? returnnil;
? ? ? ? }];
? ? }];
? ? // 監(jiān)聽事件有沒有完成
? ? [command.executing subscribeNext:^(id x) {
? ? ? ? if([xboolValue] ==YES) {// 正在執(zhí)行
? ? ? ? ? ? NSLog(@"當前正在執(zhí)行%@", x);
? ? ? ? }else{
? ? ? ? ? ? // 執(zhí)行完成/沒有執(zhí)行
? ? ? ? ? ? NSLog(@"執(zhí)行完成/沒有執(zhí)行");
? ? ? ? }
? ? }];
? ? // 2.執(zhí)行命令
? ? [commandexecute:@1];
}