reactiviecocoa的底層就不說明了。這裡就簡單介紹它的幾個基本使用場景。
cocoapods匯入reactivecocoa5.0以上版本注意事項
1、如果你使用的是純swift工程,podfile檔案描述如下:
use_frameworks!target'工程名稱'do
pod
'reactivecocoa
', '
5.0.0-alpha.3
'end
2、如果你使用的是純oc工程,podfile檔案描述如下:
use_frameworks!target'工程名稱'do
pod
'reactiveobjc
', '
~> 2.1.0
'end
3、如果你使用oc與swift混合程式設計,podfile檔案描述如下:
use_frameworks!target'工程名稱'do
pod
'reactiveobjc
', '
~> 2.1.0
'pod
'reactivecocoa
', '
5.0.0-alpha.3
'end
基本使用
#import
一、替代**,**就是這麼的簡單,如果傳遞多個值的話 x是乙個ractuple(元組)物件,這個物件在下面說明,如果值傳乙個值,那麼傳的是什麼物件,x就是什麼物件。
//redview 是在控制器view的子檢視,在redview中響應乙個事件,把需要的訊息從redview傳遞到控制器過來
//這段**是在控制器viewcontroller.m中訂閱redview的btnclick事件訊息
//如果傳遞多個值的話 x是乙個ractuple(元組)物件,比如@selector(clickwithvalue1:value2:)
[[_redveiw rac_signalforselector:@selector(btnclick:)] subscribenext:^(id
_nullable x) ];
二、代替kvo
/** 用法和原生**基本一致valuesforkeypath: observer:
self 是viewcontroller
age 是self的乙個屬性
@param x 是age改變後的值
*/[[self rac_valuesforkeypath:
@"age
" observer:nil] subscribenext:^(id
_nullable x) ];
三、事件監聽
//_btn 是乙個按鈕,給按鈕新增乙個事件。不需要像原生那樣addtarget:action:forcontrolevents:,然後再寫乙個方法給action這麼麻煩了。
[[_btn rac_signalforcontrolevents:uicontroleventtouchupinside]subscribenext:^(__kindof uicontrol *_nullable x) ];
四、代替通知
//這個用法就和系統一樣了,只是把監聽處理的**聚合在一起,不需要另外寫乙個方法,提高**閱讀性。
//我這裡是監聽了乙個鍵盤彈起的乙個通知。
[[[nsnotificationcenter defaultcenter] rac_addobserverforname:uikeyboardwillshownotification object:nil] subscribenext:^(nsnotification *_nullable x) ];
五、輸入框改變監聽
//這個使用方式和給按鈕新增事件監聽差不多。這裡controlevents不需要填了,監聽textfield的text的改變
[_textfield.rac_textsignal subscribenext:^(nsstring *_nullable x) ];
六、處理幾個訊號完成後統一處理事件。 比如說:我們在乙個介面有幾個不同的網路資料請求,我們需要監聽他們都請求完成後才處理一些事情,那麼就可以使用以下方式。
//建立訊號1
racsignal * signala = [racsignal createsignal:^racdisposable * _nullable(id
_nonnull subscriber) ];
//建立訊號2
racsignal * signalb = [racsignal createsignal:^racdisposable * _nullable(id
_nonnull subscriber) ];
//監聽 signala 和 signalb 兩個訊號都完成了才呼叫request1withcontent:request2withcontent:
//注意request1withcontent:request2withcontent:是自己寫的乙個方法,但是這個方法有個原則,就是有幾個訊號,就對應傳遞幾個值,不可以多,也不可以少,否則執行的時候就會崩潰,報方法錯誤(引數錯誤)
[self rac_liftselector:@selector(request1withcontent:request2withcontent:) withsignalsfromarray:@[signala,signalb]];
/** 請求1和請求都完成了 */
-(void)request1withcontent:(nsstring *)content1 request2withcontent:(nsstring *)content2
七、ractuple元組物件,在第一步代替**的時候提及過。元組物件和我們的陣列物件差不多,使用方法也比較簡單,rac提供了幾個巨集來建立以及解包。
/** 元組
*/ractuple * tuple = ractuplepack(@1,@2,@3);//
使用ractuplepack巨集來快速建立
nslog(@"
tuple:%@
",tuple);
//使用ractupleunpack巨集快速解包
ractupleunpack(nsnumber *num1,nsnumber *num2,nsnumber *num3) =tuple;
nslog(
@"num1:%@
",num1);
nslog(
@"num2:%@
",num2);
nslog(
@"num3:%@
",num3);
//使用下標的方式來獲取
nslog(@"
第0個:%@
",tuple[0]);
上面介紹了ractuplepack和ractupleunpack兩個巨集的使用,下面再介紹幾個常用的巨集:
1、rac繫結乙個訊號
//1、rac 把乙個物件的摸個屬性繫結乙個訊號,只有發出訊號,就會吧訊號的內容給物件的屬性賦值。
//這裡吧label的text屬性繫結到textfield改變訊號中,textfield的內容發生改變的時候就會發出訊號,label的text就會跟隨著改變。
rac(self.label,text) = _textfield.rac_textsignal;
2、racobserve相當於kvo使用
//2、kvo/**
@param self 是viewcontroller
@param age self的乙個屬性
*/[racobserve(self, age) subscribenext:^(id
_nullable x) ];
3、@weakify 和@strongify這個就是為了解決在使用block的時候強引用問題,注意這兩個巨集是配套使用才有效。
//3、把乙個物件轉換成弱指標
@weakify(self);//
self 是viewcontroller 在block外面使用@weakify
self.signal = [racsignal createsignal:^racdisposable * _nullable(id
_nonnull subscriber) ];
ReactiveCocoa常見巨集
1 rac target,keypath,nil value 用於給某個物件的某個屬性繫結。只要文字框文字改變,就會修改label的文字 rac self.labelview,text textfield.rac textsignal reactivecocoa bindings rac self,...
ReactiveCocoa個人記錄
self.mybutton rac signalforcontrolevents uicontroleventtouchupinside subscribenext id x 複製 self.mytextfield rac textsignal subscribenext id x distinct...
ReactiveCocoa學習隨筆 一
self.usernametextfield.rac textsignal subscribenext id x 實現了動態監視textfield輸入的功能,一旦有輸入,就會執行 subscribenext bloc k,動態nslog textfield 所輸入的文字。self.usernamet...