ReactiveCocoa 初识

简单介绍:

ReactiveCocoa 是近年来比较黑科技的开源框架,但是学习路线比较陡峭,现在已经更新到5.0并已全面支持 Swift 语言,针对 objc 的部分已经独立分离出来,停留在了 pod 'ReactiveObjC','~> 2.1.2' 本次学习针对的是 objc 的部分。

  • 附上 Github 地址

Functional Reactive Programming

学习 ReactiveCocoa 就要提到下面这种编程思想 Functional Reactive Programming 函数式 响应式 编程思想。

例如:

a = 1
b = 2
c = a + b = 3

b = 3
// now what is the value of c?

我们期望在 b 的值变化后 c 的值也会随之变化,所以叫做响应式编程。在 iOS 中运用 KVC. KVO. NSNotification. Delegate 等也可以做到这样的事情,但往往不够直观也比较麻烦。

而 RAC 统一了对 KVO、UI Event、Network request、Async work 的处理,因为它们本质上都是值的变化(Values over time)。


ReactiveCocoa

ReactiveCocoa 整体围绕着 RACSignal 展开,也是它的核心,它其实是一个事件源,RACSignal 会给它的订阅者(subscribers)发送一连串的事件。有三种事件:nexterrorcompletedSignal 可以在 errorcompleted 事件发出前发出任意多的 next 事件。RACCommand RACObserve RACSubject 都是其中比较重要的类。

图片来自 Limboy 的技术博客,链接在本文底部

几个简单的小

  • RACObserve 实现了对属性的绑定,返回一个 RACSignal响应属性的变化。

// When self.username changes, logs the new name to the console.
//
// RACObserve(self, username) creates a new RACSignal that sends the current
// value of self.username, then the new value whenever it changes.
// -subscribeNext: will execute the block whenever the signal sends a value.
[RACObserve(self, username) subscribeNext:^(NSString *newName) {
   NSLog(@"%@", newName);
}];

// 只有当名字以'j'开头,才会被记录
[[RACObserve(self, username)
    filter:^(NSString *newName) {// 过滤语法
        return [newName hasPrefix:@"j"];
    }]
    subscribeNext:^(NSString *newName) {
        NSLog(@"%@", newName);
    }];
  • RACCommand 已经被附加在很多基础控件上边,比如 NSButton ,它会把自身作为信号返回。

// Logs a message whenever the button is pressed.
//
// RACCommand creates signals to represent UI actions. Each signal can
// represent a button press, for example, and have additional work associated
// with it.
//
// -rac_command is an addition to NSButton. The button will send itself on that
// command whenever it's pressed.
self.button.rac_command = [[RACCommand alloc] initWithSignalBlock:^(id _) {
    NSLog(@"button was pressed!");
    return [RACSignal empty];
}];
  • RAC 还提供了超级强大的宏定义,比如让 UILable 响应 UITextView 的变化只需要这样一句话。

RAC(self.outputLabel, text) = self.inputTextField.rac_textSignal;

参考资料:

  • GitHub - ReactiveCocoa/ReactiveObjC: The 2.x ReactiveCocoa Objective-C API: Streams of values over time
  • ReactiveCocoa学习笔记 | yulingtianxia’s blog
  • ReactiveCocoa中RACObserve实例变量 | 坤坤同学
  • Reactive Cocoa Tutorial 1 = 神奇的Macros · sunnyxx的技术博客
  • Limboy’s HQ

你可能感兴趣的:(ReactiveCocoa 初识)