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"];
}