ReactiveObjC是GitHub上一个开源的已经停止维护的响应式编程框架。原作者已从ReactiveObjC转向做RXSwift的开发。
学习RAC,要先从MVVM入手,RAC作为ViewModel和Controller的粘合剂使用,能够用更少的代码完成更高效的工作。
RAC的整体流程:创建信号
- 订阅信号
- 发送信号
。没有订阅信号也就不会被创建。Block是OC的知识点,swift中为闭包。RAC绝大部分都是有Block来完成订阅后的消息处理机制。
一、RACSignal (信号)的创建、订阅
#一、创建信号,将事件转换成信号
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
/* 触发后 发送信号 */
[subscriber sendNext:@"被触发,发送信号"];
return nil;
}];
RACDisposable *disposable = [signal subscribeNext:^(id _Nullable x) {
NSLog(@"信号内容:%@", x);
}];
/*取消信号订阅*/
[disposable dispose];
二、RACTuple(元组),类似Swift的元组,但这里只是数组的扩展组合
/* 熟悉Swift的可以跳过元组认识 */
/* 创建元祖 */
RACTuple *tuple = [RACTuple tupleWithObjects:@"1", @"2", @"3", @"4", @"5", nil];
/* 从别的数组中获取内容 */
RACTuple *tuple = [RACTuple tupleWithObjectsFromArray:@[@"1", @"2", @"3", @"4", @"5"]];
/* 利用 RAC 宏快速封装 */
RACTuple *tuple = RACTuplePack(@"1", @"2", @"3", @"4", @"5");
NSLog(@"取元祖内容:%@", tuple[0]);
NSLog(@"第一个元素:%@", [tuple first]);
NSLog(@"最后一个元素:%@", [tuple last]);
三、学习了Signal和Tuple后,可以用RAC遍历数组信息,不用写for了
/* 遍历数组 */
NSArray *array = @[@"1", @"2", @"3", @"4", @"5"];
[array.rac_sequence.signal subscribeNext:^(id _Nullable x) {
NSLog(@"数组内容:%@", x); // x 可以是任何对象
}];
/* 遍历字典 */
NSDictionary *dictionary = @{@"key1":@"value1", @"key2":@"value2", @"key3":@"value3"};
[dictionary.rac_sequence.signal subscribeNext:^(RACTuple * _Nullable x) {
RACTupleUnpack(NSString *key, NSString *value) = x; // x 是一个元祖,这个宏能够将 key 和 value 拆开
NSLog(@"字典内容:%@:%@", key, value);
}];
未完待续