RAC的使用总结

PS: 新公司代码好多用了RAC 还有MVVM这一套,所以熟悉一下,阅读代码可以比较畅通无阻。

看了很多貌似还是很多看不懂,anyway,先记录一下我看的。来个栗子。
1,一个发送信号,一个接收信号。(网络场景)

    - (RACSignal *)createSignal{
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id  _Nonnull subscriber) 

    /* 发送信号 */ 
  //延迟发送,就当是网络请求了。
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        ReturnModel *model = [ReturnModel new];
        model.name = @"hello";
        model.title = @"title";
        [subscriber sendNext:model];
    });
   return nil;
}];
return signal;

}

//接收信号,就酱紫。简单模拟一个网络返回捕捉的

[[self createSignal] subscribeNext:^(ReturnModel * _Nullable response) {
    //接收信号
     NSLog(@"信号内容:%@", response.name);
}];

2,用RACCommond,应用场景,去捕捉一下Error

 self.command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {
   return [RACSignal createSignal:^RACDisposable * _Nullable(id  _Nonnull subscriber) {
        if(1){
      //如果成功了。那就万事大吉。
            [subscriber sendCompleted];
            
        }else{
    //失败了,就抛出来。
            NSError* error = [NSError errorWithDomain:@"failed"
                                                 code:@"0"
                                             userInfo:@{NSLocalizedFailureReasonErrorKey:@"fa.."}];
            [subscriber sendError:error];
        }
   //这里返回失败,这样后面可以捕捉
        return [RACDisposable disposableWithBlock:^{
            [subscriber sendError:nil];
        }];
    }];
}];


[[[self.command execute:@(1)] takeUntil:self.rac_willDeallocSignal].deliverOnMainThread subscribeError:^(NSError * _Nullable error) {
    if ([error.domain isEqualToString:@"false"]) {
        NSLog(@"123123");
    } else if ([error.domain isEqualToString:@"failed"]) {
        NSLog(@"45666");
    }
} completed:^{

}];

3, 通过监听过滤后的信号量,来去做操作。
首先,单例里面信号量是这样。

- (RACSignal *_Nonnull)statusSignal {
__weak typeof(self) weakSelf = self;
return [RACSignal createSignal:^RACDisposable * _Nullable(id  _Nonnull subscriber) {
    __strong typeof(self) strongSelf = weakSelf;
    [[RACObserve(strongSelf, newStatus) takeUntil:self.rac_willDeallocSignal] subscribeNext:^(id  _Nullable x) {
       
        [subscriber sendNext:[RACTuple tupleWithObjects:@(self.oldStatus), @(self.newStatus), nil]];
    }];
    return [RACDisposable disposableWithBlock:^{
        
    }];
}];

}

过滤的代码

- (RACSignal * _Nonnull)statusReachableSignal {
__weak typeof(self) weakSelf = self;
return [[[self statusSignal] map:^id _Nullable(RACTuple * _Nullable value) {
    return value.second;
}] filter:^BOOL(NSNumber * _Nullable value) {
    __strong typeof(self) strongSelf = weakSelf;
   if (value ==1)
    return 1;
   else return 0;
}];

}

外面VC监控单例的status

[[[[TestManager sharedManager] statusReachableSignal] takeUntil:self.rac_willDeallocSignal] subscribeNext:^(id  _Nullable x) {
        NSLog(@"3434");
    }];

4,关于RACSubject,这个应该是最简单的了。

  - (void)clickB{
[self.createButtonClickSubject sendNext:@"hello"];

}

- (RACSubject *)createButtonClickSubject{
if(!_createButtonClickSubject) {
    _createButtonClickSubject = [RACSubject subject];
}

return _createButtonClickSubject;

}

  [self.oView.createButtonClickSubject subscribeNext:^(id  _Nullable x) {
    NSLog(@"这边接受%@",x);
}];

你可能感兴趣的:(RAC的使用总结)