• [iOS] 响应式编程开发-ReactiveCocoa(二)


    RAC实现图片下载功能

    在实现异步RAC下载图片的过程中,需要注意以下几点:

      •  通过 NSURLConnection 对象的 +(RACSignal *)rac_sendAsynchronousRequest:(NSURLRequest*)r 可以创建网络异步下载的信号量对象;

      •  在执行完成异步下载过程后,需要通过 [x deliverOn:[RACScheduler mainThreadScheduler]] 操作将方法返回到主线程进行执行;

    @implementation ViewController
    {
        RACCommand  *loginCommand;
        RACSignal   *loginSignal;
    }
    
    
    - (void)awakeFromNib
    {
        //创建网络图片下载的URL对象
        NSURL *url = [NSURL URLWithString:@"http://pica.nipic.com/2007-11-09/2007119124513598_2.jpg"];
        
        //创建网络图片请求对象
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        
        //实例化命令操作对象
        loginCommand = [[RACCommand alloc] initWithSignalBlock:^(id sender) {
            
            //通过NSURLConnection的+方法,创建异步返回信号量
            return [NSURLConnection rac_sendAsynchronousRequest:request];
        }];
        
        
        //信号量完成后的插座操作
        [loginCommand.executionSignals subscribeNext:^(RACSignal *x)
        {
            //将下载完成的图片数据转换成图片对象后,在主线程赋值给imageView属性
            [[x deliverOn:[RACScheduler mainThreadScheduler]] subscribeNext:^(RACTuple *tuple)
             {
                 NSData *imageData = tuple.last;
                 
                 //imageView - UIImageView
                 self.imageView.image = [UIImage imageWithData:imageData];
    
             }];
        }];
    }
    - (void)viewDidLoad {
        [super viewDidLoad];
        //指定触发命令操作
        //btn - UIButton
        self.btn.rac_command = loginCommand;
    }
    @end
    

     

    如何使用ReactiveCocoa

    目前大量的ios应用程序在开发的过程中,是通过用户响应来改变应用程序状态的。我们在这样处理事件时,代码往往会变得非常复杂,需要用到大量的回调和状态变量来完成回调函数的功能。

    其实像 UI回调 、 网络响应 、 KVO通知 等等,会有很多的共同之处,都需要回调函数进行处理功能。

    那么RACSingal统一了这些不同的API,方便他们能够组合在一起完成复杂的功能。

    我们先看一下下边的代码:

    @implementation ViewController
    {
        MethodManager *manager;
    }
    
    - (void)awakeFromNib
    {
        manager = [MethodManager sharedManager];
    }
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(loggedOut:) name:@"loggedOut" object:manager];
        
        [self.usernameTextField addTarget:self action:@selector(textDelegate) forControlEvents:UIControlEventEditingChanged];
        [self.passwordTextField addTarget:self action:@selector(textDelegate) forControlEvents:UIControlEventEditingChanged];
        [self.logInButton addTarget:self action:@selector(didClickLogin:) forControlEvents:UIControlEventTouchUpInside];
    }
    
    - (void)dealloc {
        [NSNotificationCenter.defaultCenter removeObserver:self];
    }
    
    - (void)textDelegate {
        BOOL textFieldsNonEmpty = self.usernameTextField.text.length > 0 && self.passwordTextField.text.length > 0;
        BOOL readyToLogIn = !LoginManager.sharedManager.isLoggingIn && !self.loggedIn;
        self.logInButton.enabled = textFieldsNonEmpty && readyToLogIn;
    }
    
    - (IBAction)didClickLogin:(UIButton *)sender {
        [manager logInWithUsername:self.usernameTextField.text password:self.passwordTextField.text
         success:^{
             self.loggedIn = YES;
         } failure:^(NSError *error) {
             [self presentError:error];
         }];
    }
    
    - (void)loggedOut:(NSNotification *)notification {
        self.loggedIn = NO;
    }
    
    @end
    

      如果是RAC代码的话,我们就可以使用如下代码:

    @implementation ViewController
    {
        MethodManager *manager;
    }
    
    - (void)awakeFromNib
    {
        manager = [MethodManager sharedManager];
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        RAC(self.signButton, enabled) = [RACSignal
                                          combineLatest:@[
                                                          self.password.rac_textSignal,
                                                          self.confirm.rac_textSignal,
                                                          RACObserve(manager, signing),
                                                          RACObserve(self, signing)
                                                          ] reduce:^(NSString *username, NSString *password, NSNumber *loggingIn, NSNumber *loggedIn) {
                                                              return @(username.length > 0 && password.length > 0 && !signing.boolValue && !signing.boolValue);
                                                          }];
        
        [[self.signButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(UIButton *sender) {
            
            RACSignal *signingSignal = [manager logInWithUsername:self.usernameTextField.text password:self.passwordTextField.text];
            
            [signingSignal subscribeError:^(NSError *error) {
                [self presentError:error];
            } completed:^{
                self.signing = YES;
            }];
        }];
        
        RAC(self, signing) = [[NSNotificationCenter.defaultCenter rac_addObserverForName:@"LOSignNotification" object:nil] mapReplace:@NO];
    }
    
    @end
    

    导入ReactiveCocoa框架

    打开 终端(Terminal) 工具。进入到自己的工程目录文件夹下:

    haohao:TomRAC lewis$ vi Podfile
    

    其中 TomRAC 是公司项目文件夹名称

    创建完成 Podfile 文件后,要在该文件内输入如下内容:

    platform :ios, '6.0'
    source 'https://github.com/CocoaPods/Specs.git'
    target 'TomRAC' do
    pod 'ReactiveCocoa', '~> 2.3.1'
    end
    

    通过命令保存 Podfile 文件后,在 终端(Terminal) 输入如下命令进行下载配置 ReactiveCocoa 框架:

    pod install
    

    然后就会看到熟悉的下载提示:

    Analyzing dependencies
    Downloading dependencies
    Installing ReactiveCocoa (2.3.1)
    Generating Pods project
    Integrating client project
     
    [!] From now on use `TomRAC.xcworkspace`.

    打开工程后就能够使用ReactiveCocoa框架了。

    现有个空工程,需要跳过配置步骤想先使用的同学可以先进行下载使用。

  • 相关阅读:
    前端页面如何添加图标
    前端的百度地图的api的使用
    Jackson /常用注解/ annotation(转)
    spring mvc 全局处理异常
    java项目http变更https
    maven 项目配置到tomcat不能正常启动
    cxf-webservice完整示例
    web.xml中配置spring配置(application.xml)文件
    webService 总结
    gitHub新项目的上传
  • 原文地址:https://www.cnblogs.com/daxiaxiaohao/p/4463679.html
Copyright © 2020-2023  润新知