ReactiveCocoa(RAC)的學(xué)習(xí)

一绽昼,它是什么

ReactiveCocoa是響應(yīng)式編程(FRP)在IOS中的一個實(shí)現(xiàn)框架和蚪,就是用信號接管了iOS 中的所有事件载矿。英文比較好的小伙伴可以直接去github上看它的官方說明围肥。地址:https://github.com/ReactiveCocoa/ReactiveCocoa

? ? ? ? 可以把信號想象成水龍頭梧奢,只不過里面不是水,而是玻璃球(value)楼吃,直徑跟水管的內(nèi)徑一樣始花,這樣就能保證玻璃球是依次排列妄讯,不會出現(xiàn)并排的情況(數(shù)據(jù)都是線性處理的,不會出現(xiàn)并發(fā)情況)酷宵。水龍頭的開關(guān)默認(rèn)是關(guān)的亥贸,除非有了接收方(subscriber),才會打開浇垦。這樣只要有新的玻璃球進(jìn)來砌函,就會自動傳送給接收方×镒澹可以在水龍頭上加一個過濾嘴(filter)讹俊,不符合的不讓通過,也可以加一個改動裝置煌抒,把球改變成符合自己的需求(map)仍劈。也可以把多個水龍頭合并成一個新的水龍頭(combineLatest:reduce:),這樣只要其中的一個水龍頭有玻璃球出來寡壮,這個新合并的水龍頭就會得到這個球贩疙。

ReactiveCocoa整體可以分為四個部分

信號源(事件流)? RACStream

訂閱者? RACSubscriber

調(diào)度器? RACScheduler

清潔工? RACDisposable

二,它的用途

為了提高我們的開發(fā)效率况既。RAC在某些特定情況下開發(fā)時可以大大簡化代碼这溅,并且目前來看安全可靠。在RAC的世界中棒仍,以事件流(用Signal悲靴、SignalProductor來表示)的形式,組合和轉(zhuǎn)換信號莫其,最終得到我們想要的輸出癞尚,代碼大統(tǒng)一。

1.傳統(tǒng)iOS開發(fā)過程中乱陡,狀態(tài)以及狀態(tài)之間依賴過多的問題

2.傳統(tǒng)MVC架構(gòu)的問題:Controller比較復(fù)雜浇揩,可測試性差

3.提供統(tǒng)一的消息傳遞機(jī)制

三,它的使用

引用中的第一篇和第五篇講的比較生動憨颠,具體胳徽,建議大家去看下那里面對它的實(shí)際應(yīng)用。

* 1 RAC發(fā)送消息,并且綁定到控件

#pragma -mark 文本框輸入事件監(jiān)聽

/**

* 2爽彤、為了測試此函數(shù)养盗,增加了一個nameText;監(jiān)聽文本框的輸入內(nèi)容淫茵,并設(shè)置為self.person.name

*/

- (void)demoTextField {

@weakify(self);

[[self.nameText rac_textSignal]

subscribeNext:^(id x) {

@strongify(self);

NSLog(@"%@",x);

self.person.name = x;

}];

}

按鈕監(jiān)聽

#pragma -mark 按鈕監(jiān)聽

/**

* 4爪瓜、驗(yàn)證此函數(shù):當(dāng)loginButton可以點(diǎn)擊時,點(diǎn)擊button輸出person的屬性匙瘪,實(shí)現(xiàn)監(jiān)控的效果

*/

- (void)buttonDemo {

@weakify(self);

[[self.loginButton rac_signalForControlEvents:UIControlEventTouchUpInside]

subscribeNext:^(id x) {

@strongify(self);

NSLog(@"person.name:? %@? ? person.password:? %@",self.person.name,self.person.password);

}

];

}

* 2 RAC代理

- (void)racProtocol {

RACSignal *programmerSignal = [self rac_signalForSelector:@selector(whoAmI) fromProtocol:@protocol(Programmer)];

[programmerSignal subscribeNext:^(id x) {

NSLog(@"RAC通知------I'm a great programmer...");

}];

@weakify(self);

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

[self_weak_ whoAmI];

});

}

- (void)whoAmI {

NSLog(@"whoAmI------my name is %@",_user.userName);

}

demo2

#pragma -mark 代理方法

/** * 5铆铆、驗(yàn)證此函:nameText的輸入字符時,輸入回撤或者點(diǎn)擊鍵盤的回車鍵使passWordText變?yōu)榈谝豁憫?yīng)者(即輸入光標(biāo)移動到passWordText處) */

- (void)delegateDemo {? ?

? ? @weakify(self)?

?? // 1. 定義代理? ??

? ? self.proxy = [[RACDelegateProxy alloc]initWithProtocol:@protocol(UITextFieldDelegate)]; ?

? // 2. 代理去注冊文本框的監(jiān)聽方法

? ? [[self.proxy rac_signalForSelector:@selector(textFieldShouldReturn:)]? ? subscribeNext:^(id x) {? ?

?? ? @strongify(self)? ?

?? ? if (self.nameText.hasText) {? ?

?? ? ? ? [self.passWordText becomeFirstResponder];? ? ??

? }? ? }];?

?? self.nameText.delegate = (id)self.proxy;

}

* 3 RAC通知

- (void)racNotification {

//接受通知并且處理

[[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"RAC_Notifaciotn" object:nil] subscribeNext:^(NSNotification *notify) {

NSLog(@"notify.content = %@",notify.userInfo[@"content"]);

}];

//發(fā)出通知

[[NSNotificationCenter defaultCenter] postNotificationName:@"RAC_Notifaciotn" object:nil userInfo:@{@"content" : @"i'm a notification"}];

}

*4 RAC觀察者模式(KVO)

@weakify(self);

[RACObserve(self, value) subscribeNext:^(NSString* x) {

@strongify(self);

NSLog(@"你動了");

}];

四丹喻,注意事項(xiàng)

在RAC的block中使用self薄货,很容易造成循環(huán)泄漏,所以要使用@weakify和@strongify


五碍论,引用的文章鏈接

這樣好用的ReactiveCocoa谅猾,根本停不下來(非常推薦!w⒂啤K澳取)

iOS Reactive Cocoa使用淺析

Reactive Cocoa 技術(shù)整理

深入淺出-iOS Reactive Cocoa的常見用法

Reactive Cocoa 之旅

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市藏研,隨后出現(xiàn)的幾起案子敬矩,更是在濱河造成了極大的恐慌,老刑警劉巖蠢挡,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弧岳,死亡現(xiàn)場離奇詭異,居然都是意外死亡业踏,警方通過查閱死者的電腦和手機(jī)禽炬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勤家,“玉大人腹尖,你說我怎么就攤上這事》ゲ保” “怎么了桐臊?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長晓殊。 經(jīng)常有香客問我断凶,道長,這世上最難降的妖魔是什么巫俺? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任认烁,我火速辦了婚禮,結(jié)果婚禮上介汹,老公的妹妹穿的比我還像新娘却嗡。我一直安慰自己,他們只是感情好嘹承,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布窗价。 她就那樣靜靜地躺著,像睡著了一般叹卷。 火紅的嫁衣襯著肌膚如雪撼港。 梳的紋絲不亂的頭發(fā)上坪它,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機(jī)與錄音帝牡,去河邊找鬼往毡。 笑死,一個胖子當(dāng)著我的面吹牛靶溜,可吹牛的內(nèi)容都是我干的开瞭。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼罩息,長吁一口氣:“原來是場噩夢啊……” “哼嗤详!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瓷炮,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤葱色,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后崭别,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冬筒,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年茅主,在試婚紗的時候發(fā)現(xiàn)自己被綠了舞痰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡诀姚,死狀恐怖响牛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赫段,我是刑警寧澤呀打,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站糯笙,受9級特大地震影響贬丛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜给涕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一豺憔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧够庙,春花似錦恭应、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至剔难,卻和暖如春胆屿,著一層夾襖步出監(jiān)牢的瞬間奥喻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工莺掠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留衫嵌,地道東北人读宙。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓彻秆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親结闸。 傳聞我的和親對象是個殘疾皇子镣隶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

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