RAC - ObjC

一、Reactive 之 ObjC 介紹

  • RAC - 響應(yīng)式編程,幫我們簡(jiǎn)單粗暴地處理事件

  • RAC 是通過(guò)信號(hào) 處理事件的

  • RAC能滿(mǎn)足我們一個(gè)需求,就是所有需求

創(chuàng)建信號(hào) - 訂閱信號(hào) - 發(fā)送信號(hào)

    // 創(chuàng)建信號(hào)必須先訂閱
    // 訂閱信號(hào)必須先發(fā)送

// 創(chuàng)建信號(hào)(冷信號(hào))
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
    // 發(fā)送信號(hào)
    [subscriber sendNext:@"This is RAC"];
    
    return nil;
}];


// 訂閱信號(hào)(熱信號(hào))
[signal subscribeNext:^(id  _Nullable x) {
    // x : 指的是信號(hào)本身的數(shù)據(jù)內(nèi)容
    NSLog(@"x = %@", x);
}];    

取消訂閱

// 1.信號(hào)發(fā)送完成
// 2.信號(hào)發(fā)送失敗

// 訂閱的取消取決于 `subscriber` 是否存在
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
    [subscriber sendNext:@"this is RAC"];
    self.subscriber = subscriber;
    return [RACDisposable disposableWithBlock:^{
        NSLog(@"我取消了訂閱");
    }];
}];
RACDisposable *disposable = [signal subscribeNext:^(id  _Nullable x) {
    NSLog(@"disposable - %@", x);
}];
[disposable dispose];

二、初步使用(demo)

  • KVO
    // KVO
    self.person = [[Person alloc] init];
    // 監(jiān)聽(tīng) person 的 name 屬性
    [_RACObserve(self.person, name) subscribeNext:^(id  _Nullable x) {
        NSLog(@"name - %@", x);
    }];
    ```
    
* ######action target
// target
[[self.RACAcion rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
    NSLog(@"Click - RACAcion");
}];

* ######通知

// 通知, 監(jiān)聽(tīng)鍵盤(pán)彈出通知
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardDidChangeFrameNotification object:nil] subscribeNext:^(NSNotification * _Nullable x) {
NSLog(@"motification - %@", x);
}];
```

  • 文本框代理
// 充當(dāng)textView的代理
    [[self.RACTextView rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
        NSLog(@"textView - %@", x);
    }];
  • touchesBegin 輔助
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    // KVO
    // 在這里改變name的值
    self.person.name = [NSString stringWithFormat:@"ThinkDifferent%u", arc4random_uniform(10000)];
    
    // 通知 - 退下鍵盤(pán)
    [self.view endEditing:true];
}

三、進(jìn)階使用

界面有多個(gè)網(wǎng)絡(luò)請(qǐng)求, 當(dāng)所有網(wǎng)絡(luò)請(qǐng)求都完成時(shí), 才能展示界面.

- (void)viewDidLoad {
    [super viewDidLoad];

    RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // requestA()
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            [NSThread sleepForTimeInterval:3.0];
            [subscriber sendNext:@"網(wǎng)絡(luò)A加載完成"];
        });
        return [RACDisposable disposableWithBlock:^{
            NSLog(@"取消A信號(hào)");
        }];
    }];
    RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // requestB()
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            [NSThread sleepForTimeInterval:5.0];
            [subscriber sendNext:@"網(wǎng)絡(luò)B加載完成"];
        });
        return [RACDisposable disposableWithBlock:^{
            NSLog(@"取消B信號(hào)");
        }];
    }];

    [self rac_liftSelector:@selector(responseA:B:) withSignalsFromArray:@[signalA, signalB]];

}

- (void)responseA:(id)a B:(id)b {
    NSLog(@"%@, %@", a, b);
}

當(dāng)一個(gè)界面有多個(gè)UITextField和UIButton選項(xiàng),只有所有的UITextField都有值時(shí)UIButton才能可以點(diǎn)擊。

- (void)viewDidLoad {
    [super viewDidLoad];

    [self rac_liftSelector:@selector(responseA:B:) withSignalsFromArray:@[self.textField1.rac_textSignal, self.textField2.rac_textSignal]];

}

- (void)responseA:(NSString *)str1 B:(NSString *)str2 {
    if(![str1 isEqualToString:@""] && ![str2 isEqualToString:@""]) {
        self.btn.enabled = YES;
    } else {
        self.btn.enabled = NO;
    }
}

四、應(yīng)用

發(fā)送短信驗(yàn)證碼Demo - textView拖動(dòng)不會(huì)影響Timer

五、資源

附上唐大師博客

最后編輯于
?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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