当前位置: 移动技术网 > IT编程>移动开发>IOS > RACSignal的一些常用用法

RACSignal的一些常用用法

2018年02月26日  | 移动技术网IT编程  | 我要评论

s发布网1.85,google翻墙,刘满世

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函数

如果我们使用NSDatarac_readContentsOfURL:url方法下载的是一张图片,我们肯定希望这个Signal最后输出的是UIImage对象,这里就要用到非常常用的map函数。

map函数就像signal 管道上的中间处理器,从这里走过的signal都会经过一段处理后,变成新的signal继续传输。而这个处理过程则在map函数中由开发者决定。

将输出NSDatasignal转换为输出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);
}];```

输出如下:
2015-12-30 10:19:08.776 Fahu[1354:39991] <UIImage: 0x7f9ce2ac3730>, {450, 600}
2015-12-30 10:19:08.891 Fahu[1354:39991] <UIImage: 0x7f9ce2b02600>, {500, 687}
2015-12-30 10:19:09.098 Fahu[1354:39991] <UIImage: 0x7f9ce29a4500>, {500, 346}

 

###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[0]`是http response的头部信息,`x[1]`是请求返回的数据,是一个`NSData`对象。元组类对象的读取方法和数组相同。

 

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

  • ios uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网