RACStream
什么是 RAC?
今天从零开始学习RAC,不过什么是RAC这里就不介绍了,呵呵。
先从源码开始看起吧。
本文涉及的版本- ReactiveObjC (3.1.0)
RACStream
众所周知,RAC的核心是信号-RACSignal 进入源码
@interface RACSignal<__covariant ValueType> : RACStream
发现是继承RACStream,那就先从RACStream开始看起。
@interface RACStream<__covariant ValueType> : NSObject
<__covariant ValueType>
的意思是: __covariant 协变,子类转父类;泛型名字是ValueType
继续下面的代码
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Wstrict-prototypes\"") \
typedef id _Nonnull (^RACReduceBlock)();
typedef ValueType _Nonnull (^RACGenericReduceBlock)();
_Pragma("clang diagnostic pop")
首先#pragma在本质上是声明,常用的功能就是注释,尤其是给Code分段注释;而且它还有另一个强大的功能是处理编译器警告
_Pragma()
是#pragma
的另一种写法更加合理功能更多日后补充(TODO
)
clang diagnostic 是#pragma 第一个常用命令:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-相关命令"
// 你自己的代码
#pragma clang diagnostic pop
这里的-Wstrict-prototypes 是警告: 函数声明不是一个原型
函数声明 函数原型 还要多了解一下。
总之这里就是忽略警告的意思
具体实现代码
抽象方法
RACStream中的许多定义都是抽象的,没有具体实现,需要由其子类进行实现。
+empty;
/// Returns an empty stream.
//__kindof:表示当前类或者它子类
//
+ (__kindof RACStream<ValueType> *)empty;
+ (__kindof RACStream *)empty {
NSString *reason = [NSString stringWithFormat:@"%@ must be overridden by subclasses", NSStringFromSelector(_cmd)];
@throw [NSException exceptionWithName:NSInternalInconsistencyException reason:reason userInfo:nil];
}
`因为RAC中nil会导致crash,所以很多时候需要定义一个空对象来替代nil,一般empty都被创建为一个单例来使用。
这个方法也是由子类来实现的`
+return
/// Lifts `value` into the stream monad.
///
/// Returns a stream containing only the given value.
+ (__kindof RACStream<ValueType> *)return:(nullable ValueType)value;
+ (__kindof RACStream *)return:(id)value {
NSString *reason = [NSString stringWithFormat:@"%@ must be overridden by subclasses", NSStringFromSelector(_cmd)];
@throw [NSException exceptionWithName:NSInternalInconsistencyException reason:reason userInfo:nil];
}
`把一个值包装成对应的RACStream的子类型。
也是需要子类重写的`
今天先写到这里
如何改变文本的样式
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
插入链接与图片
链接: link.
图片: