好久么有更新了谴轮,今天給大家分享一個(gè)小小的第三方第步,但是他的用處卻很廣泛粘都。
1刷袍,首先介紹下這個(gè)框架:
ReactiveObjC是ReactiveCocoa的Objective-C版本,它是一個(gè)函數(shù)響應(yīng)式編程框架呻纹,ReactiveObjC庫(kù)的組成主要分為Core和UI兩個(gè)大類。核心庫(kù)定義的是RAC的一些類型和方法雷酪,UI部分是對(duì)Cocoa框架中的UI類進(jìn)行RAC的擴(kuò)展哥力。
ReactiveObjC的基本使用:
需要通過pod倒入:
pod 'ReactiveObjC'
2,ReactiveObjC主要有三個(gè)關(guān)鍵類:
1、RACSignal信號(hào)RACSignal 是各種信號(hào)的基類最住,其中RACDynamicSignal是用的最多的動(dòng)態(tài)信號(hào)
2涨缚、RACSubscriber訂閱者
RACSubscriber是實(shí)現(xiàn)了RACSubscriber協(xié)議的訂閱者類策治,這個(gè)協(xié)議定義了4個(gè)必須實(shí)現(xiàn)的方法
3通惫、RACDisposable清潔工
RACDisposable主要是對(duì)資源的釋放處理,其中使用RACDynamicSignal時(shí)履腋,會(huì)創(chuàng)建一個(gè)RACCompoundDisposable管理清潔工對(duì)象遵湖。其內(nèi)部定義了兩個(gè)數(shù)組,一個(gè)是_inlineDisposables[2]固定長(zhǎng)度2的A fast array延旧,超出2個(gè)對(duì)象的長(zhǎng)度由_disposables數(shù)組管理迁沫,_inlineDisposables數(shù)組速度快,兩個(gè)數(shù)組都是線程安全的近弟。
3挺智,在項(xiàng)目中我主要用到了RACSignal:
[[self.tf_password rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
ViewBorderRadius(weakSelf.view_password, 25, 1, UIColor.whiteColor);
self.tf_password.textColor = [UIColor jk_colorWithHexString:@"#222222"];
}];
//監(jiān)聽按鈕點(diǎn)擊事件
[[_btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"-->%@",x);
}];
計(jì)時(shí)器的使用:
//類似timer
@weakify(self)
self.disposable = [[RACSignal interval:2 onScheduler:[RACScheduler mainThreadScheduler]] subscribeNext:^(NSDate * _Nullable x) {
@strongify(self)
NSLog(@"時(shí)間:%@", x); // x 是當(dāng)前的時(shí)間
//關(guān)閉計(jì)時(shí)器
[self.disposable dispose];
}];
//延時(shí)
[[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"延時(shí)2秒"];
return nil;
}] delay:2] subscribeNext:^(id x) {
NSLog(@"-->%@",x);
}];
監(jiān)聽屬性變化:
//監(jiān)聽self的name屬性
[RACObserve(self, name) subscribeNext:^(id _Nullable x) {
NSLog(@"屬性的改變-->%@",x);
}];
[[self rac_valuesForKeyPath:@"name" observer:self] subscribeNext:^(id _Nullable x) {
NSLog(@"屬性的改變-->%@", x);
}];
//此處RAC宏相當(dāng)于讓_label訂閱了_textField的文本變化信號(hào)
//賦值給label的text屬性
RAC(_label, text) = _textField.rac_textSignal;