關(guān)于ReactiveObjC的使用,其實(shí)在16年的時(shí)候就已經(jīng)被開(kāi)發(fā)者們開(kāi)始使用,之前一直沒(méi)有觸及到,最近寫(xiě)項(xiàng)目的時(shí)候,關(guān)于這個(gè)動(dòng)態(tài)響應(yīng)鏈的框架有了一些了解,確實(shí)非常粗暴強(qiáng)大,在這里記錄一下基本的一些使用。
1.替代delegate
創(chuàng)建RACSubject 信號(hào),用來(lái)替代代理,使用方法如下:
/* 創(chuàng)建信號(hào) */
RACSubject *subject = [RACSubject subject];
/* 發(fā)送信號(hào) */
[subject sendNext:@"發(fā)送信號(hào)"];
在別的地方使用的時(shí)候
/* 訂閱信號(hào)(通常在別的視圖控制器中訂閱,與代理的用法類(lèi)似) */
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"信號(hào)內(nèi)容:%@", x);
}];
2.信號(hào)的刪除
由于信號(hào)一般創(chuàng)建后,相當(dāng)于是全局的,如果這個(gè)對(duì)象的信號(hào)沒(méi)有隨著對(duì)象被釋放,那么在全局任何時(shí)候都是可以觸發(fā)這個(gè)信號(hào)源的。(常見(jiàn)的是對(duì)導(dǎo)航欄監(jiān)控了信號(hào)源,如果不在某個(gè)頁(yè)面進(jìn)行釋放掉這個(gè)信號(hào)源,那么全局的導(dǎo)航欄只要觸發(fā)了導(dǎo)航欄方法,就會(huì)觸發(fā)這個(gè)信號(hào)源)
/* 創(chuàng)建信號(hào) */
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
/* 發(fā)送信號(hào) */
[subscriber sendNext:@"發(fā)送信號(hào)"];
return nil;
}];
/* 訂閱信號(hào) */
RACDisposable *disposable = [signal subscribeNext:^(id _Nullable x) {
NSLog(@"信號(hào)內(nèi)容:%@", x);
}];
/* 取消訂閱 */
[disposable dispose];
3.監(jiān)聽(tīng) TextField 的輸入改變(其他控件差不多的使用方法,這里舉個(gè)例子)
/* 監(jiān)聽(tīng) TextField 的輸入(內(nèi)容改變就會(huì)調(diào)用) */
[[textField rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"輸入框內(nèi)容:%@", x);
}];
/* 添加監(jiān)聽(tīng)條件 */
[[textField.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
return value.length > 5; // 表示輸入文字長(zhǎng)度 > 5 時(shí)才會(huì)調(diào)用下面的 block
}] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"輸入框內(nèi)容:%@", x);
}];
4.代理KVO監(jiān)聽(tīng)
可以代替 KVO 監(jiān)聽(tīng),下面表示把監(jiān)聽(tīng) view 的 frame 屬性改變轉(zhuǎn)換成信號(hào),只要值改變就會(huì)發(fā)送信號(hào)。
[[view rac_valuesForKeyPath:@"frame" observer:self] subscribeNext:^(id _Nullable x) {
NSLog(@"屬性的改變:%@", x); // x 是監(jiān)聽(tīng)屬性的改變結(jié)果
}];
還有一種更簡(jiǎn)單的寫(xiě)法,就是利用 RAC 的宏,和上面的效果是一樣的。
[RACObserve(view, frame) subscribeNext:^(id _Nullable x) {
NSLog(@"屬性的改變:%@", x); // x 是監(jiān)聽(tīng)屬性的改變結(jié)果
}];
5.監(jiān)聽(tīng)方法
可以直接對(duì)某個(gè)控制器內(nèi)部的方法進(jìn)行操作一系列代碼,挺牛b的.
[[h5VC rac_signalForSelector:@selector(viewWillAppear:)] subscribeNext:^(RACTuple * _Nullable x) {
//在viewwillappear的時(shí)候做一系列操作
}];
暫時(shí)先就這么多,以后再更新,很多可以舉一反三的,非常強(qiáng)大,之前有接觸過(guò)但沒(méi)怎么用,現(xiàn)在也給我集成項(xiàng)目中了,除了能帶來(lái)一些方便以外,確實(shí)還能解決一些我們平時(shí)無(wú)法做的的操作,所以我才用了0.0(當(dāng)無(wú)計(jì)可施的時(shí)候,用了這個(gè)才發(fā)現(xiàn)有用呀)。