ReactiveCocoa 学习笔记三(RACTuple)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011374318/article/details/82120425

RACTuple

在 CocoaReactive 中,有些信号流传递的信号量是由其他多个信号流传递的信号量组合而成的,而这多个信号量则是封装在一个 RACTuple 实例中进行传递的,所以理解该类,有助于我们理解信号量的使用。

其实该类的使用十分简单,通常只要了解两个宏即可,一个是将变量封装成实例的 RACTuplePack(…) ,另一个则是将封装的变量解析成相应变量的 RACTupleUnpack(…),其使用如下例子:

RACTupleUnpack(NSString *string, NSNumber *num) = RACTuplePack(@"foo", @5);

//上面宏的使用同下面直接使用实例效果一样
RACTuple *t = [RACTuple tupleWithObjects:@"foo", @5, nil];
NSString *string = t[0];
NSNumber *num = t[1];

RACTuple 的本质是对一个 NSArray 类型的属性的封装,该内部属性为 backingArray

在该类中的 count、first、second、third、fourth、fifth、last 等属性都是对 backingArray 的相应数量或对应的变量的访问,但是不同的是,请求的变量序号大于其实际拥有的变量数量时,直接返回 nil 而不会报错。

RACTuple 类中提供了类方法用于创建实例对象,如下:

//这两个方法有点类似,区别是前者不会将参数 array 中的 NSNull 实例对象转化为 RACTupleNil 实例对象,而后者可以通过参数 convert 进行控制
+ (instancetype)tupleWithObjectsFromArray:(NSArray *)array;
+ (instancetype)tupleWithObjectsFromArray:(NSArray *)array convertNullsToNils:(BOOL)convert;

//指定要封装的变量,nil 表示结束位置,所以要对 nil 进行封装,应使用 RACTupleNil 替代
+ (instancetype)tupleWithObjects:(id)object, ... NS_REQUIRES_NIL_TERMINATION;

//获取 backingArray 中指定索引的变量,如果其为 RACTupleNil 或索引超出范围, 则返回 nil
- (nullable id)objectAtIndex:(NSUInteger)index;

//返回一个新的数组,其包含所有的变量,并且会将 RACTupleNil 实例转换为 NSNull 实例
- (NSArray *)allObjects;

//添加一个新的变量,其返回的是一个新的 RACTuple 实例对象,并且参数 obj 可以是 nil ,其实际会被转换为 RACTupleNil 继续保存
- (__kindof RACTuple *)tupleByAddingObject:(nullable id)obj;

另外,RACTuple 有几个特殊的子类,这些子类指定了其封装的变量个数,其初始化中的变量都是 RACTupleNil 。

  • RACOneTuple
  • RACTwoTuple
  • RACThreeTuple
  • RACFourTuple
  • RACFiveTuple

RACTupleNil

RACTupleNil 是 NSObject 的子类,它用来表示 RACTuple 中保存的 nil ,在使用时,调用它的 tupleNil 方法,获取一个全局变量。

+ (RACTupleNil *)tupleNil {
    static dispatch_once_t onceToken;
    static RACTupleNil *tupleNil = nil;
    dispatch_once(&onceToken, ^{
        tupleNil = [[self alloc] init];
    });

    return tupleNil;
}

猜你喜欢

转载自blog.csdn.net/u011374318/article/details/82120425