一、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);
}];
此时打印的结果: