万物皆信号:任何事件都是通过信号去传递的。
一、 基本
RACSignal
- 信号:只有订阅 的时候才能运行
- 它是 ReactiveCocoa 最基本的类,任何地方都会用到它
- 响应式编程思想,只要信号一变化,马上通知你
- 信号本身不不具备发送消息的能力
RACDisposable
- 专门处理数据的
- 比如一些数据不要了,它就会去清空这些数据
RACSubscriber
- 订阅者
- 用它去发送跟信号相关的消息
- 信号本身不不具备发送消息的能力,是因为有一个订阅者才能发送消息。
// 创建一个信号 createSignal:^RACDisposable 其实就是函数式编程思想
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
// 在这个里面返回一个 RACDisposable
}];
/* 上面的方法的定义:
+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
return [RACDynamicSignal createSignal:didSubscribe];
}
*/
- 如何创建 RACDisposable 对象?
点击 RACDisposable 进入 它的类中,会看到+ (instancetype)disposableWithBlock:(void (^)(void))block;
方法。这个方法就是用来创建的。
// 创建 RACDisposable
return [RACDisposable disposableWithBlock:^{
// 清空数据的操作写在这里
}];
二、 block 的执行时间 及 作用
- 创建信号以后,只有订阅了才能执行 block 里面的数据。
- 有三种订阅
- 信号传的值:
- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
- 订阅信号的错误信息:
- (RACDisposable *)subscribeError:(void (^)(NSError *error))errorBlock
- 订阅完成:
- (RACDisposable *)subscribeCompleted:(void (^)(void))completedBlock
- 也可以两个,三个一起订阅 :
(RACDisposable *)subscribeNext:(void (^)(id x))nextBlock error:(void (^)(NSError *error))errorBlock completed:(void (^)(void))completedBlock
- 现在的代码如下:
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
// 创建 RACDisposable
return [RACDisposable disposableWithBlock:^{
}];
}];
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"信号的值 = %@",x);
}];
3.1 这段代码,并没有打印 信号的值,因为 没有在 RACSignal createSignal
这个方法中 给 signal subscribeNext
方法传值。
- 如何传值?使用
createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber
方法中的subscriber
. - 拿到 订阅者,才能给
subscribeNext
发送消息
[subscriber sendNext:@2];
[subscriber sendError:<#(nullable NSError *)#>];
[subscriber sendCompleted];
-
现在有3个block,他们的顺序是
- createSignal
- subscribeNext
- disposableWithBlock
- 先订阅,在发送消息
- 在订阅的时候会执行 RACSignal 的 block
- 18:32
-
读源码:
// 1. 调用的方法
[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber)
// 2. createSignal 里面的源码
+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
// RACDynamicSignal : 创建动态信号
return [RACDynamicSignal createSignal:didSubscribe];
}
// 3. createSignal:didSubscribe 方法的源码
+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
// 创建动态的信号
RACDynamicSignal *signal = [[self alloc] init];
signal->_didSubscribe = [didSubscribe copy];
return [signal setNameWithFormat:@"+createSignal:"];
}
Snip20180814_38.png
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"信号的值 = %@",x);
}];
[signal subscribeError:^(NSError * _Nullable error) {
<#code#>
}];
[signal subscribeCompleted:^{
<#code#>
}];
上面这段代码的写法是错误的
因为这样写会多次走到 createSignal方法
中。
可以使用
[signal subscribeNext:^(id _Nullable x) {
// 订阅信号的值
} error:^(NSError * _Nullable error) {
// 订阅错误
} completed:^{
// 订阅完成
}];
网友评论