ReactiveCocoa
來自: http://my.oschina.net/u/2346786/blog/614316
1.ReactiveCocoa作用
在我們iOS開發過程中,當某些事件響應的時候,需要處理某些業務邏輯,這些事件都用不同的方式來處理。比如按鈕的點擊使用action,ScrollView滾動使用delegate,屬性值改變使用KVO等系統提供的方式。其實這些事件,都可以通過RAC處理。
2.RACSiganl
RACSiganl:信號類,只是表示當數據改變時,信號內部會發出數據,它本身不具備發送信號的能力,而是交給內部一個訂閱者去發出。
RACSubscriber:表示訂閱者的意思,用于發送信號,這是一個協議,不是一個類,只要遵守這個協議,并且實現方法才能成為訂閱者。通過create創建的信號,都有一個訂閱者,幫助他發送數據。
RACDisposable:用于取消訂閱或者清理資源,當信號發送完成或者發送錯誤的時候,就會自動觸發它。
//1.創建信號 RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { //block調用時刻:每當有訂閱者訂閱信號,就會調用block //2.發送信號 [subscriber sendNext:@1]; //如果不再發送數據,最好發送信號完成,內部會自動調用[RACDisposable disposable]取消訂閱 [subscriber sendCompleted]; return [RACDisposable disposableWithBlock:^{ //block調用時刻:當信號發送完成或者發送錯誤,就會自動執行這個block,取消訂閱 NSLog(@"信號被銷毀"); }]; }]; //3.訂閱信號 [signal subscribeNext:^(id x) { //block調用時刻:每當有信號發送數據,就會調用該方法 NSLog(@"接收到的數據:%@",x); }];
3.RACSubject與RACReplaySubject
RACSubject:信號提供者,自己可以充當信號,又能發送信號。subject可以想成是signal的變體,就像NSMutableArray相對于NSArray?一樣。它們是非RAC的代碼和RAC代碼之間的橋梁。
RACReplaySubject:重復提供信號類,RACSubject的子類。
RACReplaySubject與RACSubject區別:
1).RACReplaySubject可以先發送信號,再訂閱信號,RACSubject就不可以。
2).可以設置capacity數量來限制緩存的value的數量,即只緩充最新的幾個值。
//1.創建信號 RACSubject *subject = [RACSubject subject]; //2.訂閱信號 [subject subscribeNext:^(id x) { //block調用時刻:當信號發出新值,就會調用 NSLog(@"第一個訂閱者%@",x); }]; [subject subscribeNext:^(id x) { //block調用時刻:當信號發出新值,就會調用 NSLog(@"第二個訂閱者%@",x); }]; //3.發送信號 [subject sendNext:@"1"]; //1.創建信號 RACReplaySubject *replaySubject = [RACReplaySubject subject]; // RACReplaySubject *replaySubject = [RACReplaySubject replaySubjectWithCapacity:0]; //2.發送信號 [replaySubject sendNext:@1]; [replaySubject sendNext:@2]; //3.訂閱信號 [replaySubject subscribeNext:^(id x) { NSLog(@"第一個訂閱者%@",x); }]; [replaySubject subscribeNext:^(id x) { NSLog(@"第二個訂閱者%@",x); }];
RACSubject替代代理
情景:跳轉到另一個vc,TwoVC發送通知,VC收到回調的通知
VC - (IBAction)click:(UIButton *)sender { TwoViewController *twoVC = [[TwoViewController alloc] init]; //設置代理信號 twoVC.delegateSubject = [RACSubject subject]; //訂閱代理信號 [twoVC.delegateSubject subscribeNext:^(id x) { NSLog(@"點擊了通知按鈕,%@",x); }]; //跳轉 [self presentViewController:twoVC animated:YES completion:nil]; } TwoVC if (self.delegateSubject) { //發送信號 [self.delegateSubject sendNext:@"已跳轉到TwoVC"]; }