[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框架了。

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

时间: 2024-10-27 11:54:18

[iOS] 响应式编程开发-ReactiveCocoa(二)的相关文章

IOS响应式编程框架ReactiveCocoa(RAC)使用示例

ReactiveCocoa是响应式编程(FRP)在IOS中的一个实现框架,它的开源地址为:https://github.com/ReactiveCocoa/ReactiveCocoa# :在网上看了几篇文章,感觉理论讲了很多,但是代码还是看不太懂,于是自己把它github文档上的一些使用的经典示例实现了一下,项目中有需要时可以直接搬过去用,用的熟练了再读源码也比较容易理解. 例1. 监听对象的成员变量变化,当成员变量值被改变时,触发做一些事情. 这种情况其实就是IOS KVO机制使用的场景,使用

IOS响应式编程框架ReactiveCocoa(RAC)使用示例-备

ReactiveCocoa是响应式编程(FRP)在IOS中的一个实现框架,它的开源地址为:https://github.com/ReactiveCocoa/ReactiveCocoa# :在网上看了几篇文章,感觉理论讲了很多,但是代码还是看不太懂,于是自己把它github文档上的一些使用的经典示例实现了一下,项目中有需要时可以直接搬过去用,用的熟练了再读源码也比较容易理解. 例1. 监听对象的成员变量变化,当成员变量值被改变时,触发做一些事情. 这种情况其实就是IOS KVO机制使用的场景,使用

iOS响应式编程框架ReactiveCocoa讲解与实例演示

Signal and Subscriber 这是RAC最核心的内容,如果用插头和插座来描述,插座是Signal,插头是Subscriber.插座负责去获取电,插头负责使用电,而且一个插座可以插任意数量的插头.当一个插座(Signal)没有插头 (Subscriber)时什么也不干,也就是处于冷(Cold)的状态,只有插了插头时才会去获取,这个时候就处于热(Hot)的状态. Signal获取到数据后,会调用Subscriber的sendNext, sendComplete, sendError方法

响应式编程框架ReactiveCocoa学习——框架概览

这篇博客将会继续翻译RAC的官方文档Framework Overview. 主要是对RAC这和框架进行概览的介绍和学习.同时也可以参考我前面的两篇翻译<响应式编程框架ReactiveCocoa学习--基本操作符><响应式编程框架ReactiveCocoa介绍与入门>.其中ReactiveCocoa的Github官方地址为 https://github.com/ReactiveCocoa/ReactiveCocoa . 这篇文档包括了RAC中的对不同组件的高层描述,并解释如何进行结合

高大上函数响应式编程框架ReactiveCocoa学习笔记1 简介

原创文章,转载请声明出处哈. ReactiveCocoa函数响应式编程 一.简介 ReactiveCocoa(其简称为RAC)是函数响应式编程框架.RAC具有函数式编程和响应式编程的特性.它主要吸取了.Net的 Reactive Extensions的设计和实现. 函数式编程 (Functional Programming) 函数式编程也可以写N篇,它是完全不同于OO的编程模式,这里主要讲一下这个框架使用到的函数式思想. 1) 高阶函数:在函数式编程中,把函数当参数来回传递,而这个,说成术语,我

Reactive Cocoa 响应式编程开发实例讲解-中篇

上一篇文章作为开门篇讲述了Cocoa Reactive概述. 这里我们详细介绍一下CocoaReative在代码中的应用. 网上好多blog有人形容CocoaReative 中 signals是插座或者水龙头,感觉不是很好理解.我举个更贴近生活的,用电话订菜(餐馆是Signals,电话订阅是SubScriberNext). 1.概述 Create一个Signal我们视为是一个支持电话订餐的餐馆,他们有很多菜,油盐酱醋就更不用说,当一个电话打进来首先,这个Signal就开始执行,等菜做好了,菜馆要

ReactiveCocoa,最受欢迎的iOS函数响应式编程库(2.5版),没有之一!

ReactiveCocoa,最受欢迎的iOS函数响应式编程库(2.5版),没有之一! 简介 项目主页: ReactiveCocoa 实例下载: https://github.com/ios122/ios122 简评: 最受欢迎,最有价值的iOS响应式编程库,没有之一!iOS MVVM模式的完美搭档,更多关于MVVM与ReactiveCocoa的讨论,参考这篇文章: [长篇高能]ReactiveCocoa 和 MVVM 入门 注意: ReactiveCocoa 最新3.0版本,使用Swift重写,

使用ReactiveCocoa实现iOS平台响应式编程

使用ReactiveCocoa实现iOS平台响应式编程 ReactiveCocoa和响应式编程 在说ReactiveCocoa之前,先要介绍一下FRP(Functional Reactive Programming,响应式编程),在维基百科中有这样一个例子介绍: 在命令式编程环境中,a = b + c 表示将表达式的结果赋给a,而之后改变b或c的值不会影响a.但在响应式编程中,a的值会随着b或c的更新而更新. Excel就是响应式编程的一个例子.单元格可以包含字面值或类似"=B1+C1″的公式,

IOS开发之OC篇-响应式编程Reactive Cocoa

一.Reactive Cocoa 介绍 Reactive Cocoa 是 iOS 开发的一个 "重量级" 框架 高大上的概念:响应式编程 核心概念:信号 Signal 官方网站:https://github.com/ReactiveCocoa/ReactiveCocoa 二.相关概念 1> 响应式编程 举个栗子,在一般程序开发时  a = b + c , 赋值之后 b 或者 c 的值变化后,a 的值不会跟着变化, 如果使用响应式编程,目标就是,如果 b 或者 c 的数值发生变化,