最近我正在找工作,發現很多公司并沒有使用RAC,我就在面試的時候順便建議他們使用RAC。然后回來后突然有想寫一篇關于RAC的欲望了。看這篇文章的人應該屬于iOS進階了,我個人不太建議剛入門iOS的人看這篇文章。首先ReactiveCocoa(簡稱RAC)這個知識點完全顛覆了我們之前寫代碼的習慣,所以新手看到文章很容易誤導他們從而基礎知識不夠牢固,這純粹是我個人的建議。很多人說ReactiveCocoa很重,之所以說它很重的一個重要原因是學習成本很高,我相信大家看完這篇文章之后就不會覺得很難了,也希望大家的項目里能夠用到ReactiveCocoa。
ReactiveCocoa是Mattt Thompson大神寫的一個框架,結合了函數式編程和響應式編程的思想。非常符合我們開發中高聚合,低耦合的思想。我們可以用它做很多東西,下面會給大家一一介紹。ReactiveCocoa的github主頁點這里。
- 文本框事件:
我們之前是這樣寫的
UITextField * textField = [[UITextField alloc]init];
textField.backgroundColor = [UIColor cyanColor];
[self.view addSubview:textField];
textField.frame = CGRectMake(100, 100, 200, 40);
[textField addTarget:self action:@selector(textChanged:) forControlEvents:UIControlEventEditingChanged];
- (void)textChanged:(UITextField *)textField
{
NSLog(@"%@",textField);
}
我們用RAC可以這樣寫
//第一種方法
[[textField rac_signalForControlEvents:UIControlEventEditingChanged]
subscribeNext:^(NSString * x) {
NSLog(@"x= %@",x);
}];
//第二種方法
[textField.rac_textSignal subscribeNext:^(NSString * x) {
NSLog(@"x = %@",x);
}];
2.手勢
UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc]init];
[[tap rac_gestureSignal] subscribeNext:^(UITapGestureRecognizer * tap) {
NSLog(@"tap = %@",tap);
}];
[self.view addGestureRecognizer:tap];
3.通知
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIApplicationDidEnterBackgroundNotification object:nil] subscribeNext:^(NSNotification * notification) {
NSLog(@"noti = %@",notification);
}];
//不需要removeObserver,RAC內部已經幫我們調用了removeObserver
4.定時器
// 1. 延遲某個時間后再做某件事
[[RACScheduler mainThreadScheduler]afterDelay:2 schedule:^{
NSLog(@"你好RAC");
}];
// 2. 每個一定長度時間做一件事
[[RACSignal interval:1 onScheduler:[RACScheduler mainThreadScheduler]]subscribeNext:^(NSDate * date) {
NSLog(@"date = %@",date);
}];
5.代理(有局限,只能取代沒有返回值的代理方法)
UIAlertView * alertView = [[UIAlertView alloc]initWithTitle:@"RAC" message:@"ReactiveCocoa" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ensure", nil];
[alertView show];
[[alertView rac_buttonClickedSignal]subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
5.KVO
UIScrollView * scrollView = [[UIScrollView alloc]init];
scrollView.delegate = (id<UIScrollViewDelegate>)self;
[self.view addSubview:scrollView];
scrollView.frame = CGRectMake(80, 80, 80, 80);
scrollView.contentSize = CGSizeMake(160, 160);
scrollView.backgroundColor = [UIColor redColor];
[RACObserve(scrollView, contentOffset) subscribeNext:^(id x) {
NSLog(@"x = %@",x);
}];
以上都是可以死記硬背的,上面的那些內容已經可以幫我們解決很多問題了,但是RAC的知識廣度還遠遠不止這些,接下來的一篇將給大家介紹RAC比較高級的東西了。
微博賬號:梅嘉慶(點擊關注)