RAC的使用總結(jié)

PS: 新公司代碼好多用了RAC 還有MVVM這一套,所以熟悉一下,閱讀代碼可以比較暢通無阻。

看了很多貌似還是很多看不懂,anyway,先記錄一下我看的。來個(gè)栗子。
1,一個(gè)發(fā)送信號(hào),一個(gè)接收信號(hào)。(網(wǎng)絡(luò)場(chǎng)景)

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

    /* 發(fā)送信號(hào) */ 
  //延遲發(fā)送,就當(dāng)是網(wǎng)絡(luò)請(qǐng)求了。
    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;

}

//接收信號(hào),就醬紫。簡單模擬一個(gè)網(wǎng)絡(luò)返回捕捉的

[[self createSignal] subscribeNext:^(ReturnModel * _Nullable response) {
    //接收信號(hào)
     NSLog(@"信號(hào)內(nèi)容:%@", response.name);
}];

2,用RACCommond,應(yīng)用場(chǎng)景,去捕捉一下Error

 self.command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {
   return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _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, 通過監(jiān)聽過濾后的信號(hào)量,來去做操作。
首先,單例里面信號(hào)量是這樣。

- (RACSignal<RACTuple *> *_Nonnull)statusSignal {
__weak typeof(self) weakSelf = self;
return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _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監(jiān)控單例的status

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

4,關(guān)于RACSubject,這個(gè)應(yīng)該是最簡單的了。

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

}

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

return _createButtonClickSubject;

}

  [self.oView.createButtonClickSubject subscribeNext:^(id  _Nullable x) {
    NSLog(@"這邊接受%@",x);
}];
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容