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

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

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

  1. [iOS] 响应式编程开发-ReactiveCocoa(一)

    什么是响应式编程 响应式编程是一种面向数据流和变化传播的编程范式.这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播. 例如,在命令式编程环境中 ...

  2. iOS响应式编程:ReactiveCocoa vs RxSwift 选谁好

    转载: iOS响应式编程:ReactiveCocoa vs RxSwift 选谁好 内容来自stack overflow的一个回答:ReactiveCocoa vs RxSwift – pros an ...

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

    ReactiveCocoa是响应式编程(FRP)在iOS中的一个实现框架,它的开源地址为:https://github.com/ReactiveCocoa/ReactiveCocoa# :在网上看了几 ...

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

    ReactiveCocoa是响应式编程(FRP)在IOS中的一个实现框架,它的开源地址为:https://github.com/ReactiveCocoa/ReactiveCocoa# :在网上看了几 ...

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

    简介 项目主页: ReactiveCocoa 实例下载: https://github.com/ios122/ios122 简评: 最受欢迎,最有价值的iOS响应式编程库,没有之一!iOS MVVM模 ...

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

    使用ReactiveCocoa实现iOS平台响应式编程 ReactiveCocoa和响应式编程 在说ReactiveCocoa之前,先要介绍一下FRP(Functional Reactive Prog ...

  7. [转]使用ReactiveCocoa实现iOS平台响应式编程

    原文:http://www.itiger.me/?p=38 使用ReactiveCocoa实现iOS平台响应式编程 ReactiveCocoa和响应式编程 在说ReactiveCocoa之前,先要介绍 ...

  8. iOS开发--Swift RAC响应式编程初探

    时间不是很充足, 先少说点, RAC的好处是响应式编程, 不需要自己去设置代理委托, target, 而是主要以信息流(signal), block为主, 看到这里激动吧, 它可以帮你监听你的事件, ...

  9. iOS开发--Swift RAC响应式编程

    时间不是很充足, 先少说点, RAC的好处是响应式编程, 不需要自己去设置代理委托, target, 而是主要以信息流(signal), block为主, 看到这里激动吧, 它可以帮你监听你的事件, ...

随机推荐

  1. 【经典dp】 poj 3671

    开一个dp[30010][3]的数组 其中dp[i][j]表示把第i个数改成j最少要花多少次 那么状态转移方程就列出来了: 令a=1 j!=a[i] 0 j==a[i] 那么dp[i][1]=dp[i ...

  2. Spring MVC中,事务是否可以加在Controller层

    一般而言,事务都是加在Service层的,但是爱钻牛角尖的我时常想:事务加在Controller层可不可以.我一直试图证明事务不止可以加在Service层,还可以加在Controller层,但是没有找 ...

  3. ignite客户端找不到服务端的时候如何设置退出

    ignite启动客户端时需要有服务端支持: Ignition.setClientMode(true); Ignition.start("ignite.xml"); 这里有个问题,当 ...

  4. Spring Boot 系列教程2-Data JPA

    Spring Data JPA 用来简化创建 JPA 数据访问层和跨存储的持久层功能. 官网文档连接 http://docs.spring.io/spring-data/jpa/docs/curren ...

  5. linux 终端相关

    echo cd ~/桌面 >> .bashrc 将终端默认路径设为桌面 -/.bashrc./etc/bash.bashrc./etc/profile这几个文件.这些文件的的作用时机:/e ...

  6. UVA 571 Jugs ADD18 小白书10 数学Part1 专题

    只能往一个方向倒,如c1=3,c2=5,a b从0 0->0 5->3 2->0 2->2 0->2 5->3 4->0 4->3 1->0 1- ...

  7. 借助XShell,使用linux命令sz可以很方便的将服务器上的文件下载到本地,使用rz命令则是把本地文件上传到服务器。

    rz 是将window文件传到linux服务器上,到执行rz命令的目录 sz 可以将linux文件发送到windows上,可以选择目录. https://www.google.com/ncr 登录一下 ...

  8. unity中的update、Lateupdate和FixedUpdate。

    MonoBehaviour.Update 更新 当MonoBehaviour启用时,其Update在每一帧被调用. MonoBehaviour.FixedUpdate 固定更新 当MonoBehavi ...

  9. PAT1004

    A family hierarchy is usually presented by a pedigree tree. 一个家族的层次结构经常用一个血缘树来呈现. Your job is to cou ...

  10. new del 问题

    实验一: new_del_caller工程(静态库) -new_del_caller.cpp #include <new> void new_del_caller() { ]; delet ...