ReactiveCocoa基本使用

2022-08-03 08:12:09 字數 4544 閱讀 2430

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]);

上面介紹了ractuplepackractupleunpack兩個巨集的使用,下面再介紹幾個常用的巨集

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...