RAC一些常見用法(五)

本demo詳見github

1.常見的用法

myRedView.h
#import <UIKit/UIKit.h>
@interface myRedView : UIView
@end

myRedView.m
#import "myRedView.h"
@implementation myRedView
-(instancetype)initWithFrame:(CGRect)frame{
    if([super initWithFrame:frame]){
        self.backgroundColor = [UIColor redColor];
        UIButton *btn  =  [UIButton new];
        btn.frame = CGRectMake(0, 0, 40, 40);
        [btn setBackgroundColor:[UIColor greenColor]];
        [self addSubview:btn];
        [btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
    }
    return self;
}

-(void)btnClick{
    NSLog(@"點擊了紅色view中的按鈕");
    // 通知控制器做事情
}
@end

RACCommonUsages.h
#import <UIKit/UIKit.h>
@interface RACCommonUsages : UIViewController
@end


RACCommonUsages.m

#import "RACCommonUsages.h"
#import "myRedView.h"
#import <ReactiveObjC.h>

@interface RACCommonUsages ()
@property (nonatomic,assign)int  age;
@end

@implementation RACCommonUsages
- (void)viewDidLoad {
    [super viewDidLoad];
    self.age = 0;
    
    [self RAC_Delegate];
    
    [self RAC_KVO];
    
    [self RAC_ObserveAction];
    
    [self RAC_ObserveTextFieldAndNotification];
    
    [self ARC_MoreSituations]; 
}

//控制器要監(jiān)聽紅色的view上的button的點擊
-(void)RAC_Delegate{
    // 1.RAC替換代理
    // RAC:判斷下一個方法有沒有調(diào)用,如果調(diào)用了就會自動發(fā)送一個信號給你
    // 只要self調(diào)用viewDidLoad就會轉(zhuǎn)換成一個信號
    // 監(jiān)聽_redView有沒有調(diào)用btnClick,如果調(diào)用了就會轉(zhuǎn)換成信號
    myRedView *v = [[myRedView alloc]initWithFrame:CGRectMake(0, 100, 100, 200)];
    [self.view addSubview:v];
    [[v rac_signalForSelector:@selector(btnClick)] subscribeNext:^(RACTuple * _Nullable x) {
        NSLog(@"控制器知道,點擊了紅色的view");
    }];
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    self.age++;
    NSLog(@"點擊增的值:%d",self.age);
}

-(void)RAC_KVO{
    // 2.KVO
    // 監(jiān)聽哪個對象的屬性改變
    // 方法調(diào)用者:就是被監(jiān)聽的對象
    // KeyPath:監(jiān)聽的屬性
    // 把監(jiān)聽到內(nèi)容轉(zhuǎn)換成信號
    [[self rac_valuesForKeyPath:@"age" observer:self] subscribeNext:^(id  _Nullable x) {
        NSLog(@"監(jiān)聽的值%@",x);
    }];
}

-(void)RAC_ObserveAction{
    UIButton *btn  =  [UIButton new];
    btn.frame = CGRectMake(20, 400, 40, 40);
    [btn setBackgroundColor:[UIColor lightGrayColor]];
    [self.view addSubview:btn];
    //3.監(jiān)聽事件
    //只要產(chǎn)生UIControlEventTouchUpInside就會轉(zhuǎn)換成信號
    [[btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
        NSLog(@"點擊了btn");
    }];
}


-(void)RAC_ObserveTextFieldAndNotification{
    UITextField *textF = [[UITextField alloc]init];
    textF.borderStyle =  UITextBorderStyleRoundedRect;
    textF.frame = CGRectMake(200, 100, 100, 40);
    [self.view addSubview:textF];
    
    //4.監(jiān)聽通知
    // 只要發(fā)出這個通知,又會轉(zhuǎn)換成一個信號
    [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) {
        NSLog(@"彈出鍵盤");
    }];
    
    //5.監(jiān)聽文本框文字改變
    // 獲取文本框文字改變的信號
    [textF.rac_textSignal subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
}

//6.兩種(多種)情況都有數(shù)據(jù)的時候才去做相應(yīng)的事情
-(void)ARC_MoreSituations{
    // 創(chuàng)建熱門商品的信號
    RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // 處理信號
        NSLog(@"請求熱門商品");
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            // 發(fā)送數(shù)據(jù)
            [subscriber sendNext:@"熱門商品"];
        });
        return nil;
    }];
    
    // 創(chuàng)建熱門商品的信號
    RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // 處理信號
        NSLog(@"請求最新商品");
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            // 發(fā)送數(shù)據(jù)
            [subscriber sendNext:@"最新商品"];
        });
        return nil;
    }];
    
    // RAC:就可以判斷兩個信號有沒有都發(fā)出內(nèi)容
    // SignalsFromArray:監(jiān)聽哪些信號的發(fā)出
    // 當(dāng)signals數(shù)組中的所有信號都發(fā)送sendNext就會觸發(fā)方法調(diào)用者(self)的selector
    // 注意:selector方法的參數(shù)不能亂寫,有幾個信號就對應(yīng)幾個參數(shù)
    // 不需要主動訂閱signalA,signalB,方法內(nèi)部會自動訂閱
    [self rac_liftSelector:@selector(updateUIWithHot:new:) withSignalsFromArray:@[signalA,signalB]];
}

// 更新UI
- (void)updateUIWithHot:(NSString *)hot new:(NSString *)new
{
    NSLog(@"更新UI");
}

-(void)dealloc{
    NSLog(@"%s",__FUNCTION__);
}
@end

2.RAC常見的宏

#import "RACCommonDefines.h"
#import <ReactiveObjC.h>

@interface RACCommonDefines ()
@property (nonatomic,strong)UITextField  *textF;
@property (nonatomic,strong)UILabel  *showLab;
@end

@implementation RACCommonDefines

- (void)viewDidLoad {
    [super viewDidLoad];
    self.textF = [[UITextField  alloc]initWithFrame:CGRectMake(20, 100, 300, 40)];
    self.textF.borderStyle = UITextBorderStyleRoundedRect;
    [self.view addSubview:self.textF];
    
    self.showLab = [[UILabel alloc]initWithFrame:CGRectMake(20, 200, 300, 40)];
    [self.view addSubview:self.showLab];
    self.showLab.backgroundColor = [UIColor redColor];
    
    [self RAC_define];
    
    [self RAC_KVO];
    
    [self RAC_RACTuple];
}

//RAC宏
-(void)RAC_define{
    RAC(self.showLab, text) = self.textF.rac_textSignal;
    /*
    [self.textF.rac_textSignal subscribeNext:^(id x) {
        self.showLab.text = x;
    }];
     */
}

-(void)RAC_KVO{
    [RACObserve(self.showLab, text) subscribeNext:^(id x) {
        NSLog(@"KVO監(jiān)聽文本的變化%@", x);
     }];
}


-(void)CyclicReferences{
    /*
    @weakify(self);
    @strongify(self);
     */
}


/*
 * 元祖
 * 快速包裝一個元組
 * 把包裝的類型放在宏的參數(shù)里面,就會自動包裝
 */
-(void)RAC_RACTuple{
    RACTuple *tuple = RACTuplePack(@1,@2,@4);
    // 宏的參數(shù)類型要和元祖中元素類型一致战授, 右邊為要解析的元祖享甸。
    RACTupleUnpack_(NSNumber *num1, NSNumber *num2, NSNumber * num3) = tuple;// 4.元祖
    // 快速包裝一個元組
    // 把包裝的類型放在宏的參數(shù)里面,就會自動包裝
    NSLog(@"%@ %@ %@", num1, num2, num3);
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    [self.view endEditing:YES];
}

-(void)dealloc{
    NSLog(@"%s",__FUNCTION__);
}
@end

3.發(fā)送驗證碼

#import "Demo.h"
#import <ReactiveObjC.h>

@interface Demo ()
@property (nonatomic,assign)int time;
@property (nonatomic,strong) RACDisposable *disposable;
@end

@implementation Demo

- (void)viewDidLoad {
    [super viewDidLoad];
    UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(20, 100, 100, 60)];
    [btn setBackgroundColor:[UIColor redColor]];
    [btn setTitle:@"發(fā)送驗證碼" forState:UIControlStateNormal];
    [btn  addTarget:self action:@selector(reSendCode:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];
}

-(void)reSendCode:(UIButton*)sender{
    self.time = 15;
    @weakify(self);
    self.disposable = [[RACSignal interval:1.0 onScheduler:[RACScheduler mainThreadScheduler]]  subscribeNext:^(NSDate * _Nullable x) {
        @strongify(self);
        self.time--;
        NSString *btnText = self.time >0 ? [NSString stringWithFormat:@"%ds",self.time]:@"發(fā)送驗證碼";
        [sender setTitle:btnText forState:(UIControlStateNormal)];
        if(self.time>0){
            sender.enabled = NO;
        }else{
            sender.enabled = YES;
            [self.disposable dispose];//在我們?nèi)∠嗛喌哪且粍x那,幫我們打斷了循環(huán)引用
        }
    }];
}

-(void)dealloc{
    NSLog(@"%s",__FUNCTION__);
}
@end

友情鏈接:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市贩虾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖寞宫,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拉鹃,居然都是意外死亡辈赋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門膏燕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钥屈,“玉大人,你說我怎么就攤上這事坝辫』捞悖” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵阀溶,是天一觀的道長腻脏。 經(jīng)常有香客問我,道長银锻,這世上最難降的妖魔是什么永品? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮击纬,結(jié)果婚禮上鼎姐,老公的妹妹穿的比我還像新娘。我一直安慰自己更振,他們只是感情好炕桨,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肯腕,像睡著了一般献宫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上实撒,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天姊途,我揣著相機與錄音涉瘾,去河邊找鬼。 笑死捷兰,一個胖子當(dāng)著我的面吹牛立叛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贡茅,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼秘蛇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了顶考?” 一聲冷哼從身側(cè)響起赁还,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎村怪,沒想到半個月后秽浇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡甚负,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年柬焕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梭域。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡斑举,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出病涨,到底是詐尸還是另有隱情富玷,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布既穆,位于F島的核電站赎懦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏幻工。R本人自食惡果不足惜励两,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望囊颅。 院中可真熱鬧当悔,春花似錦、人聲如沸踢代。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胳挎。三九已至饼疙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間串远,已是汗流浹背宏多。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工儿惫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留澡罚,地道東北人伸但。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像留搔,于是被迫代替她去往敵國和親更胖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容