一绽昼,它是什么
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澳取)