iOS中RAC的使用

hither發表於2017-12-13

iOS中RAC的使用

  • Reactive Cocoa(RAC)是一個支援FRP(函式響應式程式設計)的框架;詳細的就不再多介紹了,直接說說在我們開發中一些RAC的常見用法;

替換代理

場景:一個View中放著一個Button
當我們點選Button的時候,檢視控制器如果需要知道這個Button被點選了,一般我們需要寫一個代理去通知控制器。
在RAC中我們不需要寫代理,我們需要這樣做:
[[_redView rac_signalForSelector:@Selector(btnClicked:)]subscribeNext:^(id x){
      NSLog(@"View中的按鈕被點選了");
}];
//這樣做 是將一個方法轉換成訊號
複製程式碼

KVO

監聽一些屬性的變化,只要屬性改變就會呼叫,並把改變的值傳遞給你。
如:
@property(noatomic,assign) int age;

[[self rac_valueForKeyPath:@"age" observer:nil] subscribeNext:^(id x ){
    NSLog(@"%@",x);
}];

//模擬一個事件  觸控螢幕 就讓age自增
-(void)touchesBegin:(NSSet<UITouch*>*)touches WithEvent:(UIEvent*)event{
    age++;
}
複製程式碼

監聽事件

監聽一個按鈕的點選事件:
[[_btn rac_signalForControlEvents:UIControlEventsTouchUpInside] subscribeNext:^(id x ){
      NSLog(@"點選了按鈕");//在其中 我們做以前單獨拿出去寫的事件方法一樣的事情
}];
複製程式碼

監聽通知

如監聽鍵盤彈出:
[[NSNotificationCenter defaultCenter] rac_addObserverForName: UIKeyboardWillShowNotification  object:nil] subscribeNext:^(id x ){
      NSLog(@"鍵盤彈出");
}];
複製程式碼

監聽文字框文字改變

[_textField.rac_textSignal subscribeNext:^(id x){
      NSLog(@"%@",x);//這裡的X就是文字框的文字
}];
複製程式碼

需要幾個地方資料請求都完成以後再重新整理介面的需求

RACSignal*signalA = [RACSignal createSignal:^RACDisposable *(id <RACSubscribe>subscriber){
  NSLog(@"資料請求1");
[subscriber sendNext:@"資料請求1請求下來的資料"];
return nil;
}];

RACSignal*signalB = [RACSignal createSignal:^RACDisposable *(id <RACSubscribe>subscriber){
  NSLog(@"資料請求2");
[subscriber sendNext:@"資料請求2請求下來的資料"];
return nil;
}];

//將兩個訊號組合 如果兩個都有訊號發出 則執行回撥方法 
[self rac_liftSelector:@Selector(updateUI:new:) withSignalFromArray:@[signalA,signalB]];
//在這裡需要注意 陣列中有幾個引數 回撥方法裡也應該有幾個引數!
複製程式碼

常用的巨集

1.
[_textField.textSignal subscribeNext:^(id x ){
    self.label.text = x;
}];

//把一個物件的某個屬性繫結成一個訊號,只要發出訊號,就會把訊號的內容給物件的屬性賦值。
上面的三行程式碼用下面這個巨集代替:
RAC(self.label.text) = _textField.rac_textSignal;

其中RAC()括號中  是需要你填寫的目標物件的屬性;
複製程式碼
2.KVO  (快速監聽某個物件的某個屬性改變)

如:監聽當前檢視控制器中心點的變化
[RACObserver (self.view,center) subscribeNext:^(id x){

}];

複製程式碼
3. Block中使用self 避免迴圈引用的出現
@weakify(self);//將self轉換成弱指標
RACSignal*signalB = [RACSignal createSignal:^RACDisposable *(id <RACSubscribe>subscriber){ 
@strongify(self);//轉換成強指標 避免在block中被釋放
NSLog(@"%@",self.view);
return nil;}];
複製程式碼
4.元組
//快速組裝元組
RACTuple*tuple = RACTuplePack(@1,@3);
NSLog(@"%@",tuple);
//快速解析元組
RACTupleUnPack(NSNumber*num1,NSNumber*num2) = tuple;
//巨集的參數列示你需要把這個元組解析成什麼型別的資料

複製程式碼

最近看到一篇寫的很詳細的:

[http://limboy.me/tech/2013/12/27/reactivecocoa-2.html]

相關文章