ReactiveCocoa学习笔记

822 阅读2分钟

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