iOS開發(fā)之ReactiveCocoa(一)
前言
前段時(shí)間在看Masonry這個(gè)全新的第三方的布局框架的時(shí)候,開始了解了鏈?zhǔn)骄幊?后來慢慢的又開始了解函數(shù)式編程和響應(yīng)式編程.在這集中的編程思想下,開始接觸和研究了ReactiveCocoa這個(gè)框架.在很多大神的blog中,都對(duì)這個(gè)框架有著高度的評(píng)價(jià),各種秀自己如何靈活的使用ReactiveCocoa.今天主要就是這個(gè)框架的一些自己的學(xué)習(xí)筆記.
1.ReactiveCocoa簡(jiǎn)介
ReactiveCocoa(簡(jiǎn)稱為RAC),是由Github開源的一個(gè)應(yīng)用于iOS和OS開發(fā)的新框架.
ReactiveCocoa結(jié)合了幾種編程風(fēng)格:
- 函數(shù)式編程(Functional Programming):使用高階函數(shù)杆查,例如函數(shù)用其他函數(shù)作為參數(shù)荒典。
- 響應(yīng)式編程(Reactive Programming):關(guān)注于數(shù)據(jù)流和變化傳播裙盾。
ReactiveCocoa就被開發(fā)者們描述為響應(yīng)式函數(shù)編程框架(FRP);使用RAC就不需要考慮調(diào)用的順序,直接考慮結(jié)果,使得代碼高聚合,方便管理.
2.ReactiveCocoa使用
2.1 RACSiganl(RAC的核心類):信號(hào)類 用來數(shù)據(jù)傳遞
注意點(diǎn)
:
- 該信號(hào)默認(rèn)是一個(gè)冷信號(hào),當(dāng)值改變了,也并不會(huì)觸發(fā)改信號(hào),只有訂閱了該信號(hào),才會(huì)觸發(fā)改信號(hào).
- 訂閱信號(hào)的方法:
subscribeNext:
//創(chuàng)建一個(gè)信號(hào)
RACSignal *singal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//發(fā)送一個(gè)信號(hào).
[subscriber sendNext:@"Ricky"];
//如果不在發(fā)送數(shù)據(jù)尸诽,最好發(fā)送信號(hào)完成,內(nèi)部會(huì)自動(dòng)調(diào)用[RACDisposable disposable]取消訂閱信號(hào)筹麸。
[subscriber sendCompleted];
return [RACDisposable disposableWithBlock:^{
//信號(hào)取消
}];
}];
//訂閱信號(hào) ,激活信號(hào)
[singal subscribeNext:^(id x) {
//x : 就是信號(hào)發(fā)送到數(shù)據(jù)
NSLog(@"%@",x);
}];
2.2 替換Target和Action
- TextField的字符變化
UITextField *textField =[[UITextField alloc]initWithFrame:CGRectMake(100, 100, 100, 40)];
textField.backgroundColor =[UIColor redColor];
[self.view addSubview:textField];
//監(jiān)聽UITextField的輸入變化
[[textField rac_textSignal] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
//x就是textfield的text,所以就把id修改成NSString
// [[textField rac_textSignal] subscribeNext:^(NSString * text) {
//
// NSLog(@"%@",text);
// }];
- UIButton的事件的監(jiān)聽
UIButton *button =[UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(100, 100, 100, 100);
button.backgroundColor = [UIColor yellowColor];
[self.view addSubview:button];
[[button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
//這個(gè)x就是button,已經(jīng)知道了類型就可以把id x 修改成UIButton *button
NSLog(@"%@",x);
}];
- 手勢(shì)事件
UITapGestureRecognizer *tap =[[UITapGestureRecognizer alloc]init];
[[tap rac_gestureSignal] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[self.view addGestureRecognizer:tap];
- 通知
RAC的通知不需要移除,RAC會(huì)自己處理改通知的移除
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIApplicationDidEnterBackgroundNotification object:nil] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
- 定時(shí)器
//延遲一定時(shí)間做某事
[[RACScheduler mainThreadScheduler]afterDelay:2 schedule:^{
NSLog(@"Ricky");
}];
//每個(gè)多長(zhǎng)時(shí)間調(diào)用一次事件
[[RACSignal interval:1 onScheduler:[RACScheduler mainThreadScheduler]] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
- KVO
監(jiān)聽UIScrollView的contentOffset
UIScrollView *scroller =[[UIScrollView alloc]initWithFrame:CGRectMake(100, 100, 100, 200)];
[self.view addSubview:scroller];
[RACObserve(scroller, contentOffset) subscribeNext:^(id x) {
NSLog(@"%@",x);
}];