RACSignal的一些常用用法
NSData + RACSupport.h @interface NSData (RACSupport) // Read the data at the URL using -[NSData initWithContentsOfURL:options:error:].
// Sends the data or the error.
// 返回一个URL异步请求的信号量
// scheduler 不能为空
+ (RACSignal *)rac_readContentsOfURL:(NSURL *)URL options:(NSDataReadingOptions)options scheduler:(RACScheduler *)scheduler; @end
NSData
尝试这个例子之前,请在Demo工程的info.plist文件中加入App Transport Security Settings键值,并加入Allow Arbitrary Loads:YES键值对,用来开启iOS下的非安全连接。
可以这样用
NSURL* url = [NSURL URLWithString:@"http://www.jianshu.com"];
RACSignal* getDataSignal = [NSData rac_readContentsOfURL:url options:NSDataReadingUncached
scheduler:[RACScheduler mainThreadScheduler]];
[getDataSignal subscribeNext:^(id x) {
NSLog(@"%@",x); //这里的x就是NSData数据
}];
map函数
如果我们使用NSData的rac_readContentsOfURL:url方法下载的是一张图片,我们肯定希望这个Signal最后输出的是UIImage对象,这里就要用到非常常用的map函数。
map函数就像signal 管道上的中间处理器,从这里走过的signal都会经过一段处理后,变成新的signal继续传输。而这个处理过程则在map函数中由开发者决定。
将输出NSData的signal转换为输出UIImage
NSURL* url = [NSURL URLWithString:@"http://img1.gtimg.com/gamezone/pics/24159/24159840.jpg"];
RACSignal* getDataSignal = [NSData rac_readContentsOfURL:url options:NSDataReadingUncached
scheduler:[RACScheduler mainThreadScheduler]]; //map函数进行转换
RACSignal* getImageSignal = [getDataSignal map:^id(id value) {
if (value) {
return [UIImage imageWithData:value];
}
return nil;
}]; [getImageSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
merge方法
接着我们提出一个新需求,同时请求三张不同的图片,并将它们发送的信号合并成一条信号量。这里就需要用到信号量的merge方法,如下
NSURL* url = [NSURL URLWithString:@"http://img1.gtimg.com/gamezone/pics/24159/24159840.jpg"];
NSURL* url2 = [NSURL URLWithString:@"http://i3.hoopchina.com.cn/blogfile/201306/29/137247593017986.jpg"];
NSURL* url3 = [NSURL URLWithString:@"http://img.youxile.com/pic/1301/25170237170.jpg"];
RACSignal* getImageSignal1 = [[NSData rac_readContentsOfURL:url
options:NSDataReadingUncached
scheduler:[RACScheduler mainThreadScheduler]]
map:^id(id value) {
if (value) {
return [UIImage imageWithData:value];
}
return nil;
}]; RACSignal* getImageSignal2 = [[NSData rac_readContentsOfURL:url2
options:NSDataReadingUncached
scheduler:[RACScheduler mainThreadScheduler]]
map:^id(id value) {
if (value) {
return [UIImage imageWithData:value];
}
return nil;
}]; RACSignal* getImageSignal3 = [[NSData rac_readContentsOfURL:url3
options:NSDataReadingUncached
scheduler:[RACScheduler mainThreadScheduler]]
map:^id(id value) {
if (value) {
return [UIImage imageWithData:value];
}
return nil;
}]; //合并操作
RACSignal* mergeSignal = [RACSignal merge:@[getImageSignal1,getImageSignal2,getImageSignal3]]; [mergeSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];``` 输出如下:
-- ::08.776 Fahu[:] <UIImage: 0x7f9ce2ac3730>, {, }
-- ::08.891 Fahu[:] <UIImage: 0x7f9ce2b02600>, {, }
-- ::09.098 Fahu[:] <UIImage: 0x7f9ce29a4500>, {, }
###filter函数
网络也会有连不上的时候,三张图片中如果有哪一张请求失败,我们并不想让`signal`发送`nil`值过来,可以使用filter函数对`signal`进行筛选。稍微改造一下上面的`mergeSignal`:
RACSignal* mergeSignal = [[RACSignal merge:@[getImageSignal1,getImageSignal2,getImageSignal3]] filter:^BOOL(id value) {
return @(!!value);
}];`
注意这里的filter函数返回的是NSNumber型的BOOL值,YES是通过,NO时拒绝通过。
NSURLConnection
有了RAC,一些简单的网络请求都可以不用AF框架了。
NSURLConnection+RACSupport.h
+ (RACSignal *)rac_sendAsynchronousRequest:(NSURLRequest *)request;``` 举个例子,还是请求图片
NSURL* url = [NSURL URLWithString:@"http://img1.gtimg.com/gamezone/pics/24159/24159840.jpg"]; NSURLRequest* request = [NSURLRequest requestWithURL:url];
RACSignal* connectionSignal = [NSURLConnection rac_sendAsynchronousRequest:request];
[connectionSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];` 输出 <RACTuple: 0x7f826c071c00> ...省略``` 注意,这个`signal`发送的信号量是一个`RACTuple`对象。 ###RACTuple `RACTuple`(元组)类,是`RAC`中专门用来返回多个返回值的类,这个设计很像swift中的元组。 上面例子中的`RACTuple`有两个返回值,`x[]`是http response的头部信息,`x[]`是请求返回的数据,是一个`NSData`对象。元组类对象的读取方法和数组相同。
RACSignal的一些常用用法的更多相关文章
- centos的vi常用用法
centos的vi常用用法 vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的 ...
- MySql与SqlServer的一些常用用法的差别
MySql与SqlServer的一些常用用法的差别 本文为转载 本文将主要列出MySql与SqlServer不同的地方,且以常用的存储过程的相关内容为主. 1. 标识符限定符 SqlServer [] ...
- [转]ssh常用用法小结
ssh常用用法小结 1.连接到远程主机: 命令格式 : ssh name@remoteserver 或者 ssh remoteserver -l name 说明:以上两种方式都可以远程登录到远程主机, ...
- 【三支火把】---一份程序看懂C程序printf()的几种常用用法
闲来继续巩固我的学习之路,今天略微整理了一下,C程序中Printf()的一些常用用法,虽然自己以前好像会,但是不够系统,今天大致整理了一些,先贴上来看看,以后在看到其他,继续补充,希望能帮到一些像我一 ...
- grep参数说明及常用用法
grep参数说明及常用用法 趁着午休的时间把自己经常使用的一些grep命令整理一下. 方便以后查看. 后续会逐步把awk/sed/find等常用的命令理一理. 增强下记忆. 也算是对得起自己了. ^^ ...
- ssh常用用法小结
ssh常用用法小结 1.连接到远程主机: 命令格式 : ssh name@remoteserver 或者 ssh remoteserver -l name 说明:以上两种方式都可以远程登录到远程主机, ...
- C# Linq基本常用用法
1.什么是Linq? Lanaguage Interated Query(语言集成查询),Linq 是集成C# 和VB这些语言中用于提供数据查询能力的一个新特性. 这里只介绍两种基本常用用法. 学习方 ...
- Java集合中迭代器的常用用法
该例子展示了一个Java集合中迭代器的常用用法public class LinkedListTest { public static void main(String[] args) { List&l ...
- iptables-25个常用用法【转】
本文介绍25个常用的iptables用法.如果你对iptables还不甚了解,可以参考上一篇iptables详细教程:基础.架构.清空规则.追加规则.应用实例,看完这篇文章,你就能明白iptables ...
随机推荐
- AttributeError: 'TestLogin' object has no attribute 'driver' in Pycharm for python selenium
自动化测试学习中的问题: 最近几天在写登陆测试,遇到一个问题,困惑我的几个小时......... 我各种百度,花费大量时间,才找到我的问题的根本所在,最终解决了我的问题,主要是大小写的问题def Se ...
- hi3531芯片的标识寄存器
芯片的标识寄存器 0xee0.0xee4.0xee8.0xeec(基址是0x2005_0000) 系统控制器提供了芯片标识(ID)寄存器SC_SYSID.这个标识寄存器是一个概念上 的32bit 的标 ...
- Java利用递归算法统计1-6的数组排列组合数
Java利用递归算法统计1-6的数组排列组合数 1.设计源码 /** * @Title:ArrayCombination.java * @Package:com.you.data * @Descrip ...
- windows驱动程序wdf--KMDF大致框架
继WDM后微软出了WDF,封装了WDM中的一些基本代码逻辑.本人菜鸟,也不知道本质上有何区别,只觉得是多了Wdf开头的函数,基本的编程框架上有点出入. KMDF是WDF的内核级部分,为了理清KMDF的 ...
- 命令行工具osql.exe使用
目标: 快速在21个库修改Test表的某条记录,这几个库都分别在不同的服务器上. 通常会想到,到每个库都执行一下语句不就好了吗?这个数据库切换来切换去,挺麻烦了,通过命令行工具osql.exe就可以快 ...
- 页面jquery调试的一个宝贵经验(类似于Eclipse中的写出一个对象点它的方法时候用alt加/可以跳出来它所有的方法)
案例讲解 一,html片段 <div class="page-upload"> <div class="tab-wrapper2"> & ...
- JNDI在本项目中的应用
一,在tomcat的context文件中做如下配置 <?xml version="1.0" encoding="UTF-8"?> <Conte ...
- 移动端开发底部元素margin-bottom失效解决办法
一.情景 记得之前开发一个微信端页面时,发现页面底部元素margin-bottom在ios下失效,在安卓内正常...... 1.safari浏览器内页面底部元素设置margin-bottom失效: 2 ...
- Keras FAQ: 常见问题解答
Keras官方中文版文档 如何引用 Keras? 如何在 GPU 上运行 Keras? 如何在多 GPU 上运行 Keras 模型? "sample", "batch&q ...
- 配置maven环境出现ARP tomcat native library 版本安装跟需求版本不一致时的解决方法An incompatible version xxxx of the APR based Apache Tomcat Native library is installed, while Tomcat requires version xxxx
此地址下载你所需要的library版本http://archive.apache.org/dist/tomcat/tomcat-connectors/native/ 点击binaries 点win32 ...