ReactiveObjC 學習筆記

2022-07-14 10:57:18 字數 4480 閱讀 2072

reactiveobjc (一般來說又叫做reactivecocoa或者rac)是乙個基於響應式程式設計的objective-c的框架。使用起來真的很強大,可以用來代替監聽事件方法,代替kvo,代替通知**等。

一.使用

使用pods匯入:

pod 'reactiveobjc', '~> 3.1.0'

二.流程分析

rac核心思想:建立訊號-訂閱訊號-傳送訊號,主要有三個關鍵類:

1、racsignal訊號

racsignal是各種訊號的基類,其中racdynamicsignal是用的最多的動態訊號

2、racsubscriber訂閱者

racsubscriber是實現了racsubscriber協議的訂閱者類,這個協議定義了4個必須實現的方法

- (void)sendnext:(nullableid)value; //常見

- (void)senderror:(nullablenserror*)error; //常見

- (void)sendcompleted; //常見

- (void)didsubscribewithdisposable:(raccompounddisposable *)disposable;

3、racdisposable清潔工

racdisposable主要是對資源的釋放處理,其中使用racdynamicsignal時,會建立乙個raccompounddisposable管理清潔工物件。其內部定義了兩個陣列,乙個是_inlinedisposables[2]固定長度2的a fast array,超出2個物件的長度由_disposables陣列管理,_inlinedisposables陣列速度快,兩個陣列都是執行緒安全的。

三.具體使用

1、rac_textsignal文字監聽訊號,可以減少對**方法的依賴

uitextfield*field = [[uitextfield alloc]initwithframe:cgrectmake(50, 50, 200, 50)];

field.backgroundcolor = [uicolor graycolor];

[self.view addsubview:field];

//uitextfield建立了乙個 `textsignal`的訊號,並訂閱了該訊號

//當uitextfield的內容發生改變時,就會**subscribenext

[[field rac_textsignal] subscribenext:^(nsstring *_nullablex) ] subscribenext:^(nsstring *_nullablex) ];

注意:rac_addobserverforname同樣需要移除監聽。rac通知監聽會返回乙個racdisposable清潔工的物件,在dealloc中銷毀訊號,訊號銷毀時,rac在銷毀的block中移除了監聽

- (void)dealloc

7、代替timer迴圈執行

[[racsignal interval:1.0 onscheduler:[racscheduler scheduler]] subscribenext:^(nsdate *_nullablex) ;

[dictionary.rac_sequence.signal subscribenext:^(id_nullablex) ];

}return self;

}-(racsubject *)btnclicksingle

return _btnclicksingle;

}在viewcontroller中

//只能代替沒有返回值的**

-(void)demo3];

}

11.用來給某個物件的某個屬性繫結訊號,只要產生訊號內容,就把內容給屬性賦值

uitextfield*field = [[uitextfield alloc]initwithframe:cgrectmake(50, 120, 200, 50)];

field.backgroundcolor = [uicolor greencolor];

[self.view addsubview:field];

uilabel*label = [[uilabel alloc]initwithframe:cgrectmake(50, 50, 200, 50)];

[self.view addsubview:label];

rac(label,text) = field.rac_textsignal;

12.登入按鈕的狀態根據輸入框內容改變

uitextfield*usernametf = [[uitextfield alloc]initwithframe:cgrectmake(40, 70, 200, 50)];

uitextfield*passwordtf = [[uitextfield alloc]initwithframe:cgrectmake(40, 130, 200, 50)];

usernametf.placeholder = @"請輸入使用者名稱";

passwordtf.placeholder = @"請輸入密碼";

[self.view addsubview:usernametf];

[self.view addsubview:passwordtf];

uibutton*loginbtn = [[uibutton alloc]initwithframe:cgrectmake(40, 180, 200, 50)];

[loginbtn settitle:@"馬上登入" forstate:uicontrolstatenormal];

[self.view addsubview:loginbtn];

rac(loginbtn, enabled) = [racsignal combinelatest:@[usernametf.rac_textsignal, passwordtf.rac_textsignal] reduce:^id_nullable(nsstring * username, nsstring * password){

return@(username.length >= 11 && password.length >= 6);

rac(loginbtn,backgroundcolor) = [racsignal combinelatest:@[usernametf.rac_textsignal, passwordtf.rac_textsignal] reduce:^id_nullable(nsstring * username, nsstring * password){

return(username.length >= 11 && password.length >= 6) ? [uicolor redcolor] : [uicolor graycolor];

13.避免迴圈引用,外部用@weakify(self),內部用@strongify(self)

// @weakify() 巨集定義

@weakify(self) //相當於__weak typeof(self) weakself = self;

racsignal *signal = [racsignal createsignal:^racdisposable *(idsubscriber) {

@strongify(self)  //相當於__strong typeof(weakself) strongself = weakself;

nslog(@"%@",self.view);

returnnil;

_signal = signal;

原理及流程簡介:

C Primer Chapter One學習筆記

筆記 1.流 從io裝置上讀入或寫出的字串行,用來說明字元隨時間順序生成或消耗。2.輸入輸出符可連用原因 operator 或operator 返回stream物件。3.要測試程式那個語句出錯,使用cout 4.新建乙個內建型別,如int i 0 最好先初始化,不然用到的時候沒初始化會產生奇怪的錯誤...

BroadcastReceiver學習筆記

需要注意 的是,不要在 onreceive 方法中新增過多的邏輯或者進行任何的耗時操作,因為在廣播接收 器中是不允許開啟執行緒的,當 onreceive 方法執行了較長時間而沒有結束時,程式就會報錯。有序broadcast,sendorderedbroadcast intent,null abort...

CDISC SDTM SE domain 學習筆記

整理翻譯自 sdtm ig 3.2 www.cdisc.org sdtm se subject elements 鞏固每個subject的epochs和elements的起止時間點.se對於有多個 時期的試驗有著重要的用處 如crossover試驗 se包含乙個subject從乙個element進入...