单个信号进行观察
Observe a value:
[RACObserve(self, username) subscribeNext:^(NSString *newName) {
NSLog(@“%@“ newName);
}];
[self.usernameTextField.rac_textSignal subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
* RACObserve(A, a): create a new RACSignal, which sends the CURRENT value of A.a, THEN SENDS THE NEW VALUE whenever it changes.
* subscribeNext: will execute the block whenever the signal sends a value.
一个信号进行过滤 (subscribe一个filter过后的信号)
filter 只能起到阻挡一部分信号, 让一部分信号通过的功能
`signal -> filtered signal -> subscribeNext`
Observe a value and do a filter:
[[RACObserve(self, username)
filter:^(NSString *newName) {
// 实际上是filter了一个信号, 并对其进行过滤, "返回"一个新的信号:
return [newName hasPrefix:@"j"];
}]
subscribe:^(NSString *newName) {
// subscribe的是这个新返回的信号
NSLog(@"%@", newName);
}];
* filter: RETURN a new RACSignal that only sends a new value when its block return YES.
一个信号进行map
map可以让signal内的数据map到另外一个值.
[[[self.usernameTextField.rac_textSignal
map:^id(NSString *text) {
// 将singal内的数据map成其他的数据, NSString -> NSNumber
// 并返回一个signal
return @(text.length);
}]
filter:^BOOL(NSNumber *length) {
// 对这个信号进行filter, 并返回新的signal
return [length integerValue];
}]
subscribeNext:^(id x) {
// 订阅信号
NSLog(@"%@", x);
}];
多个信号组合在一起
Derive state (When several signals being triggered and meets all requirements together, it will do something)
e.g. self.createEnabled will be set to true when both password and passwordConfirm are the same
RACSignal *validUsernameSignal =
[self.usernameTextField.rac_textSignal
map:^id(NSString *text) {
return @([self isValidUsername:text]);
}];
RACSignal *validPasswordSignal =
[self.passwordTextField.rac_textSignal
map:^id(NSString *text) {
return @([self isValidPassword:text]);
}];
RACSignal *signUpActiveSignal =
[RACSignal combineLatest:@[validUsernameSignal, validPasswordSignal]
reduce:^id(NSNumber *usernameValid, NSNumber *passwordValid) {
return @([usernameValid boolValue] && [passwordValid boolValue]);
}];
[signUpActiveSignal subscribeNext:^(NSNumber *signupActive) {
self.signInButton.enabled = [signupActive boolValue];
}];
* RAC(A, a): Make the binding for the value A.a and the signal return value.
* combineLatest:reduce: Takes an array of signal, combine them in the block, then return new created signal bringing the value returned from the block.