ReactiveCocoa學習筆記

weixin_33935777發表於2018-01-22

一、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);

}];

此時列印的結果如下:


RACSubject.jpeg

RACReplaySubject程式碼示例:

//建立訊號

RACReplaySubject*replaySubject = [RACReplaySubjectsubject];

//訂閱訊號

[replaySubjectsubscribeNext:^(idx) {

NSLog(@"訂閱者一接收到訊號: %@", x);

}];

//傳送資料

[replaySubjectsendNext:@"hello, RAC."];

//訂閱訊號

[replaySubjectsubscribeNext:^(idx) {

NSLog(@"訂閱者二接收到訊號: %@",x);

}];

此時列印的結果:


RACReplaySubject.jpeg


相關文章