萬物皆信號:任何事件都是通過信號去傳遞的褐澎。
一、 基本
RACSignal
- 信號:只有訂閱 的時候才能運行
- 它是 ReactiveCocoa 最基本的類呜呐,任何地方都會用到它
- 響應(yīng)式編程思想站辉,只要信號一變化培漏,馬上通知你
- 信號本身不不具備發(fā)送消息的能力
RACDisposable
- 專門處理數(shù)據(jù)的
- 比如一些數(shù)據(jù)不要了,它就會去清空這些數(shù)據(jù)
RACSubscriber
- 訂閱者
- 用它去發(fā)送跟信號相關(guān)的消息
- 信號本身不不具備發(fā)送消息的能力狮鸭,是因為有一個訂閱者才能發(fā)送消息合搅。
// 創(chuàng)建一個信號 createSignal:^RACDisposable 其實就是函數(shù)式編程思想
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
// 在這個里面返回一個 RACDisposable
}];
/* 上面的方法的定義:
+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
return [RACDynamicSignal createSignal:didSubscribe];
}
*/
- 如何創(chuàng)建 RACDisposable 對象?
點擊 RACDisposable 進(jìn)入 它的類中歧蕉,會看到+ (instancetype)disposableWithBlock:(void (^)(void))block;
方法灾部。這個方法就是用來創(chuàng)建的。
// 創(chuàng)建 RACDisposable
return [RACDisposable disposableWithBlock:^{
// 清空數(shù)據(jù)的操作寫在這里
}];
二惯退、 block 的執(zhí)行時間 及 作用
- 創(chuàng)建信號以后赌髓,只有訂閱了才能執(zhí)行 block 里面的數(shù)據(jù)。
- 有三種訂閱
- 信號傳的值:
- (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
- 現(xiàn)在的代碼如下:
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
// 創(chuàng)建 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
發(fā)送消息
[subscriber sendNext:@2];
[subscriber sendError:<#(nullable NSError *)#>];
[subscriber sendCompleted];
-
現(xiàn)在有3個block,他們的順序是
- createSignal
- subscribeNext
- disposableWithBlock
- 先訂閱逃呼,在發(fā)送消息
- 在訂閱的時候會執(zhí)行 RACSignal 的 block
- 18:32
讀源碼:
// 1. 調(diào)用的方法
[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber)
// 2. createSignal 里面的源碼
+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
// RACDynamicSignal : 創(chuàng)建動態(tài)信號
return [RACDynamicSignal createSignal:didSubscribe];
}
// 3. createSignal:didSubscribe 方法的源碼
+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
// 創(chuàng)建動態(tài)的信號
RACDynamicSignal *signal = [[self alloc] init];
signal->_didSubscribe = [didSubscribe copy];
return [signal setNameWithFormat:@"+createSignal:"];
}
[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:^{
// 訂閱完成
}];