一、RACSignal 訊號類
// RACSignal使用步驟: 1.建立訊號; 2.訂閱訊號; 3.傳送訊號;
// 1.建立訊號(冷訊號)
RACSignal*signal = [RACSignalcreateSignal:^RACDisposable*_Nullable(id_Nonnullsubscriber) {
// 3.傳送訊號
[subscribersendNext:@"hello, RAC."];
returnnil;
}];
// 2.訂閱訊號(熱訊號)
[signalsubscribeNext:^(id_Nullablex) {
NSLog(@"%@", x);
}];
// RACDynamicSignal訊號執行順序(注意:不同型別的訊號處理的方式不同)
// 1.訂閱訊號會執行,建立訊號時傳入的didSubscribe block引數裡的程式碼.
// 2.傳送訊號會執行,訂閱訊號時傳入的nextBlock block引數裡的程式碼.
ReactiveCocoa中計時器的使用
[[RACSignalinterval:1.0onScheduler:[RACSchedulercurrentScheduler]]subscribeNext:^(idx) {
NSLog(@"%@", x);
}];
ReactiveCocoa中超時
RACSignal*signal = [[RACSignalcreateSignal:^RACDisposable*(id subscriber) {
[subscribersendNext:@"hello, RAC."];
returnnil;
}]timeout:60.0onScheduler:[RACSchedulercurrentScheduler]];
[signalsubscribeNext:^(idx) {
NSLog(@"%@",x);
}error:^(NSError*error) {
NSLog(@"%@",error);
}];
ReactiveCocoa中延時
[[[RACSignalcreateSignal:^RACDisposable*(id subscriber) {
[subscribersendNext:@"hello, RAC."];
returnnil;
}]delay:2.0]subscribeNext:^(idx) {
NSLog(@"%@",x);
}];
RACsignal訊號訂閱與取消訂閱
// 自動取消訂閱
RACSignal*signal = [RACSignalcreateSignal:^RACDisposable*(id subscriber ) {
_subscriber= subscriber;
[subscribersendNext:@"hello, RAC."];
//如果訊號不再傳送資料,最好呼叫訊號的傳送完成方法,該方法會呼叫[RACDisposable disposable]取消訂閱訊號.
[subscribersendCompleted];
return[RACDisposabledisposableWithBlock:^{
//訂閱者釋放時會自動取消訂閱訊號,但是隻要訂閱者沒有釋放,就不會取消訂閱訊號.
NSLog(@"訊號被取消訂閱了!");
}];
// 手動取消訂閱需要呼叫dispose方法
[_disposabledispose];
RACSubject 與 RACReplaySubject 訊號提供者
區別:RACSubject必須要先訂閱訊號之後才能傳送訊號,而RACReplaySubject可以先傳送訊號後訂閱.
RACSubject程式碼示例:
//建立訊號
RACSubject*subject = [RACSubjectsubject];
//訂閱訊號
[subjectsubscribeNext:^(idx) {
NSLog(@"訂閱者一接收到訊號: %@", x);
}];
//傳送資料
[subjectsendNext:@"hello, RAC."];
//訂閱訊號
[subjectsubscribeNext:^(idx) {
NSLog(@"訂閱者二接收到訊號: %@",x);
}];
此時列印的結果如下:
RACReplaySubject程式碼示例:
//建立訊號
RACReplaySubject*replaySubject = [RACReplaySubjectsubject];
//訂閱訊號
[replaySubjectsubscribeNext:^(idx) {
NSLog(@"訂閱者一接收到訊號: %@", x);
}];
//傳送資料
[replaySubjectsendNext:@"hello, RAC."];
//訂閱訊號
[replaySubjectsubscribeNext:^(idx) {
NSLog(@"訂閱者二接收到訊號: %@",x);
}];
此時列印的結果: