前言
前段時間在看Masonry這個全新的第三方的佈局框架的時候,開始瞭解了鏈式程式設計.後來慢慢的又開始瞭解函數語言程式設計和響應式程式設計.在這集中的程式設計思想下,開始接觸和研究了ReactiveCocoa這個框架.在很多大神的blog中,都對這個框架有著高度的評價,各種秀自己如何靈活的使用ReactiveCocoa.今天主要就是這個框架的一些自己的學習筆記.
1.ReactiveCocoa簡介
ReactiveCocoa(簡稱為RAC),是由Github開源的一個應用於iOS和OS開發的新框架.
ReactiveCocoa結合了幾種程式設計風格:
- 函數語言程式設計(Functional Programming):使用高階函式,例如函式用其他函式作為引數。
- 響應式程式設計(Reactive Programming):關注於資料流和變化傳播。
ReactiveCocoa就被開發者們描述為響應式函式程式設計框架(FRP);使用RAC就不需要考慮呼叫的順序,直接考慮結果,使得程式碼高聚合,方便管理.
2.ReactiveCocoa使用
2.1 RACSiganl(RAC的核心類):訊號類 用來資料傳遞
注意點
:
- 該訊號預設是一個冷訊號,當值改變了,也並不會觸發改訊號,只有訂閱了該訊號,才會觸發改訊號.
- 訂閱訊號的方法:
subscribeNext:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//建立一個訊號 RACSignal *singal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { //傳送一個訊號. [subscriber sendNext:@"Ricky"]; //如果不在傳送資料,最好傳送訊號完成,內部會自動呼叫[RACDisposable disposable]取消訂閱訊號。 [subscriber sendCompleted]; return [RACDisposable disposableWithBlock:^{ //訊號取消 }]; }]; //訂閱訊號 ,啟用訊號 [singal subscribeNext:^(id x) { //x : 就是訊號傳送到資料 NSLog(@"%@",x); }]; |
2.2 替換Target和Action
- TextField的字元變化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
UITextField *textField =[[UITextField alloc]initWithFrame:CGRectMake(100, 100, 100, 40)]; textField.backgroundColor =[UIColor redColor]; [self.view addSubview:textField]; //監聽UITextField的輸入變化 [[textField rac_textSignal] subscribeNext:^(id x) { NSLog(@"%@",x); }]; //x就是textfield的text,所以就把id修改成NSString // [[textField rac_textSignal] subscribeNext:^(NSString * text) { // // NSLog(@"%@",text); // }]; |
- UIButton的事件的監聽
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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) { //這個x就是button,已經知道了型別就可以把id x 修改成UIButton *button NSLog(@"%@",x); }]; |
- 手勢事件
RAC的通知不需要移除,RAC會自己處理改通知的移除
1 2 3 4 |
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIApplicationDidEnterBackgroundNotification object:nil] subscribeNext:^(id x) { NSLog(@"%@",x); }]; |
- 定時器
1 2 3 4 5 6 7 8 9 10 11 |
//延遲一定時間做某事 [[RACScheduler mainThreadScheduler]afterDelay:2 schedule:^{ NSLog(@"Ricky"); }]; //每個多長時間呼叫一次事件 [[RACSignal interval:1 onScheduler:[RACScheduler mainThreadScheduler]] subscribeNext:^(id x) { NSLog(@"%@",x); }]; |
- KVO
監聽UIScrollView的contentOffset
1 2 3 4 5 6 7 |
UIScrollView *scroller =[[UIScrollView alloc]initWithFrame:CGRectMake(100, 100, 100, 200)]; [self.view addSubview:scroller]; [RACObserve(scroller, contentOffset) subscribeNext:^(id x) { NSLog(@"%@",x); }]; |