ReactiveCocoa的舉例

原帖:http://www.cocoachina.com/ios/20150123/10994.html


-(void)initUI
{
    [self.txtUsername.rac_textSignal subscribeNext:^(id x) {
        //NSLog(@"%@",x);
    }];
    
    RACSignal *validUsernameSignal=[self.txtUsername.rac_textSignal map:^id(NSString *text) {
        return @([self isValidUsername:text]);
    }];
    
    RACSignal *validPasswordSignal=[self.txtPassword.rac_textSignal map:^id(NSString *text) {
        return @([self isValidUsername:text]);
    }];
    
    RAC(self.txtUsername,backgroundColor)=[validUsernameSignal map:^id(NSNumber *usernameValid) {
        return [usernameValid boolValue]?[UIColor clearColor]:[UIColor yellowColor];
    }];
    
    RAC(self.txtPassword,backgroundColor)=[validPasswordSignal map:^id(NSNumber *passwordValid) {
        return [passwordValid boolValue]?[UIColor clearColor]:[UIColor yellowColor];
    }];
    
    RACSignal *signUpActiveSignal=[RACSignal combineLatest:@[validUsernameSignal,validPasswordSignal] reduce:^id(NSNumber *usernameValid,NSNumber *passwordValid){
        return @([usernameValid boolValue]&&[passwordValid boolValue]);
    }];
    
    [signUpActiveSignal subscribeNext:^(NSNumber  *signupActive) {
        if ([signupActive boolValue]) {
            self.btnLogin.enabled=YES;
            [self.btnLogin setBackgroundColor:[UIColor redColor]];
        }
        else
        {
            self.btnLogin.enabled=NO;
            [self.btnLogin setBackgroundColor:[UIColor whiteColor]];
        }
    }];
    
    [[[[self.btnLogin rac_signalForControlEvents:UIControlEventTouchUpInside]
      doNext:^(id x) {
          self.btnLogin.enabled=NO;
      } ]
      
      flattenMap:^id(id value) {
          return [self signInSignal];
      }]
     subscribeNext:^(NSNumber  *signIn) {
         self.btnLogin.enabled=YES;
         BOOL success=[signIn boolValue];
         
         if (success) {
             [Common addAlertViewWithTitel:@"登陸成功"];
         }
         else
         {
             [Common addAlertViewWithTitel:@"失敗"];
         }
     }] ;
    
}

-(RACSignal*)signInSignal
{
    return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [self signInWithUserName:self.txtUsername.text password:self.txtPassword.text complete:^(BOOL success) {
            [subscriber sendNext:@(success)];
            [subscriber sendCompleted];
        }];
        return nil;
    }];
}

-(void)signInWithUserName:(NSString*)username password:(NSString*)password complete:(ReturnBack)completeBlock
{
    dispatch_time_t time=dispatch_time(DISPATCH_TIME_NOW, (int16_t)(NSEC_PER_SEC*2.0));
    dispatch_after(time, dispatch_get_main_queue(), ^{
        BOOL success=[username isEqualToString:@"user"]&&[password isEqualToString:@"password"];
        completeBlock(success);
    });
}


-(BOOL)isValidUsername:(NSString*)text
{
    return text.length>3;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章