天天看點

ReactiveCocoa 學習筆記(一)

1. subscribeNext

ReactiveCocoa signal(RACSignal)發送事件流給它的subscriber。目前總共有三種類型的事件:next、error、completed。一個signal在因error終止或者完成前,可以發送任意數量的next事件。在本教程的第一部分,我們将會關注next事件。在第二部分,将會學習error和completed事件。

2. filter 可過濾事件流

[[self.usernameTextField.rac_textSignal filter:^BOOL(id value) {
        NSString *text = value;
        return text.length > 3;
    }] subscribeNext:^(id x) {
        NSLog(@"%@", x);
           

編譯運作,在text field隻能怪輸入幾個字,你會發現隻有當輸入超過3個字元時才會有log。

3. map 操作可以轉換信号

[[[self.usernameTextField.rac_textSignal map:^id(NSString *text) {
        return @(text.length);
    }] filter:^BOOL(NSNumber *length) {
        return [length integerValue] > 3;
    }] subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
           

轉換原來的輸入字元串 為 字元的長度個數了, 是以列印效果如下

2015-07-29 15:00:41.546 ReactiveCocoa_demo1[2541:975109] 4

2015-07-29 15:00:47.818 ReactiveCocoa_demo1[2541:975109] 5

4. RAC 提供的宏綁定

RAC(self.passwordTextField, backgroundColor) =

[validPasswordSignal

map:^id(NSNumber *passwordValid){

return

[passwordValid boolValue] ? [UIColor clearColor]:[UIColor yellowColor];

}];

5.聚合信号  combineLatest:  reduce:

RACSignal *singUpActiveSignal = [RACSignal combineLatest:@[validUserNameSignal, validPasswordSingnal] reduce:^id(NSNumber*usernameValid, NSNumber *passwordValid){
        return @([usernameValid boolValue]&&[passwordValid boolValue]);
    }];
    [singUpActiveSignal subscribeNext:^(NSNumber *signupActive) {
        self.signInButton.enabled = [signupActive boolValue];
    }];
           

6. 在外部信号的 subscribeNext:block裡訂閱内部信号

隻需要把map操作改成flattenMap就可以了

下面的例子中,如果還是map 操作的話,接收到的是uibutton的點選事件流。 想要接收内部 return [self signInSignal] 這個事件流,就需要 前面 由map 改為 flattemMap.

    [[[self.signInButton rac_signalForControlEvents:UIControlEventTouchUpInside] flattenMap:^id(id x) {

        return [self signInSignal];

    }] subscribeNext:^(NSNumber *signedIn) {

        BOOL success = [signedIn boolValue];

        self.signInFailureText.hidden = success;

        if (success) {

            [self performSegueWithIdentifier:@"signInSuccess" sender:self];

        }

    }];

7.do Next 操作 就是賦加操作, 在點選按鈕的同僚,想要處理一些操作 由第6點的代碼 轉變為如下代碼,加入了do next 操作

[[[[self.signInButton rac_signalForControlEvents:UIControlEventTouchUpInside] doNext:^(id x) {
        self.signInButton.enabled = NO;
        self.signInFailureText.hidden = YES;
    }] flattenMap:^RACStream *(id value) {
        return [self signInSignal];
    }] subscribeNext:^(NSNumber *signedIn) {
        self.signInButton.enabled = YES;
        BOOL success = [signedIn boolValue];
        self.signInFailureText.hidden = success;
        if (success) {
            [self performSegueWithIdentifier:@"signInSuccess" sender:self];
        }
    }];
           

總結,好了,第一部分先學到這裡。下面是原文連結。 cococachina主站/ios/20150123/10994.html