RAC(ReactiveCocoa)使用方法(二)

RAC(ReactiveCocoa)使用方法(一)
RAC(ReactiveCocoa)使用方法(二)

上篇文章:RAC(ReactiveCocoa)使用方法(一)
中主要介绍了一些RAC中常见类的用法,这篇文章主要总结日常开发中结合一些UI控件的用法。
RAC给常见的很多UI类拓展了用法,使得开发变得越来越简单,减少了很多不必要的代理和Target代码,RAC内部已经处理好了这些事件。
---

网络请求

贴上核心代码,具体代码见Github;

//
//  ViewModel.m
//  
//
//  Created by soliloquy on 2017/11/28.
////豆瓣电影API
#define url @"https://api.douban.com/v2/movie/in_theaters?apikey=0b2bdeda43b5688921839c8ecb20399b&city=%E5%8C%97%E4%BA%AC&start=0&count=100&client=&udid="#import "ViewModel.h"
#import <AFNetworking/AFNetworking.h>
#import <MJExtension/MJExtension.h>
#import "Model.h"@implementation ViewModel
- (instancetype)init
{self = [super init];if (self) {__weak typeof (self)weakSelf = self;self.command = [[RACCommand alloc]initWithSignalBlock:^RACSignal *(id input) {return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {[weakSelf fetchData:^(NSArray *arr) {[subscriber sendNext:arr];[subscriber sendCompleted];} failure:^(NSError *error) {[subscriber sendError:error];}];return nil;}];}];}return self;
}- (void)fetchData:(void(^)(NSArray *arr))successBlock failure:(void(^)(NSError *error))failure{AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];manager.requestSerializer = [AFJSONRequestSerializer serializer];manager.responseSerializer = [AFJSONResponseSerializer serializer];[manager GET:url parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {NSArray *arr = [Model mj_objectArrayWithKeyValuesArray:responseObject[@"subjects"]];/** 方法一:block回调出去if (self.dataSourceBlock) {self.dataSourceBlock(arr);}*//**方法二 : ReactiveCocoa*/if (successBlock) {successBlock(arr);}} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {if (failure) {failure(error);}}];
}@end
- (void)viewDidLoad {[super viewDidLoad];[self bindViewModel];
}- (void)bindViewModel {/** RAC */@weakify(self)[self.viewModel.command.executionSignals.switchToLatest  subscribeNext:^(NSArray *dataSource) {@strongify(self);self.dataSource = dataSource;NSLog(@"%@",dataSource);}];// 返回错误[self.viewModel.command.errors subscribeNext:^(NSError *_Nullable x) {NSLog(@"-- error : %@", x.description);}];//执行command[self.viewModel.command execute:nil];
}

代理

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"标题" message:@"123456" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"other", nil];
[[self rac_signalForSelector:@selector(alertView:clickedButtonAtIndex:) fromProtocol:@protocol(UIAlertViewDelegate)] subscribeNext:^(RACTuple *tuple) {NSLog(@"%@",tuple.first);NSLog(@"%@",tuple.second);NSLog(@"%@",tuple.third);
}];
[alertView show];

通知

  • 发送通知
NSMutableArray *dataArray = [[NSMutableArray alloc] initWithObjects:@"1", @"2", @"3", nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"notiName" object:dataArray];
  • 接收通知
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"notiName" object:nil] subscribeNext:^(NSNotification *notification) {NSLog(@"%@", notification.name);NSLog(@"%@", notification.object);
}];

KVO

    UIScrollView *scrolView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];scrolView.contentSize = CGSizeMake(200, 800);scrolView.backgroundColor = [UIColor redColor];[self.view addSubview:scrolView];[RACObserve(scrolView, contentOffset) subscribeNext:^(id x) {NSLog(@"contentOffset: %@",x);}];

Target-Action

  • UIButton
[[self.button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {NSLog(@"x:%@", x);}];
  • UITextField
[self.tf.rac_textSignal subscribeNext:^(id x) {NSLog(@"x:%@", x);self.label.text = x;}];
[[self.tf.rac_textSignal map:^id(id value) {return [UIColor redColor];}] subscribeNext:^(id x) {
//        NSLog(@"x:%@", x);}];
  • UIView
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]init];[tap.rac_gestureSignal subscribeNext:^(id x) {NSLog(@"x:%@", x);self.redView.backgroundColor = [UIColor yellowColor];}];[self.redView addGestureRecognizer: tap];

详情见github.

转载于:https://www.cnblogs.com/soliloquy/p/7920556.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487202.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unordered_map使用自定义enum作为键值

首先定义模板作为unordered_map的第三个参数&#xff1a; struct EnumClassHash {template <typename T>std::size_t operator()(T t) const{return static_cast<std::size_t>(t);} }; 使用&#xff1a; enum class MyEnum {};std::unordered_map<MyEnum, i…

王恩哥院士:信息化发展进程中,科学、基础研究和技术、应用都是关键

图为王恩哥院士接受新华网采访来源&#xff1a;新华网由深圳市人民政府指导&#xff0c;中国信息化百人会主办&#xff0c;华为技术有限公司协办的中国信息化百人会2020年峰会于8月7日启幕。会上&#xff0c;中国信息化百人会顾问、中国科学院院士、北京大学原校长、中国科学院…

数据传址赋值问题

例如&#xff1a; int a 0&#xff1b; void test (&a) { for (int i 0; i < 10; I) { *a; } } 并不能拿到想要的值&#xff0c;反而可能都是随机值&#xff0c;最好使用*a 1。因为*a是先a后*取值&#xff0c;导致指针位置变化&#xff0c;值并没有变。

js 时间格式化

/*** 获取本周、本季度、本月、上月的开始日期、结束日期*/var now new Date(); //当前日期 var nowDayOfWeek now.getDay(); //今天本周的第几天 var nowDay now.getDate(); //当前日 var nowMonth now.getMonth(); //当前月 var nowYear now.getYear(); //当前年 n…

英特尔的六大新技术

来源&#xff1a;芯东西&#xff08;公众号&#xff1a;aichip001&#xff09; 芯东西8月14日消息&#xff0c;昨日晚间&#xff0c;英特尔在2020年架构日上推出10nm SuperFin晶体管技术&#xff0c;将实现其有史以来最强大的单节点内性能增强。据悉&#xff0c;10nm SuperFin技…

c++查找pair,使用map,unordered_map,vector

map和unordered_map都可以简单的实现&#xff0c;因为本身就是键值对&#xff0c;而且都提供find方法&#xff0c;相对来说unordered_map比map略快。 vector使用find_if函数&#xff0c;并且最简单的用法就是c 特性中的lambda&#xff0c;例如&#xff1a; static vector<…

判断jQuery选择器结果为空 - CSDN博客

判断jQuery选择器结果为空 - CSDN博客 原文:判断jQuery选择器结果为空 - CSDN博客jQuery选择器获取到的是一个对象&#xff0c;所以无论页面上存在或者不存在元素&#xff0c;这个对象都不为空。因此&#xff0c;如果要使用jQuery检查元素再给某个页面上是否存在的时候&#xf…

中国芯片设计云技术白皮书2.0发布

来源&#xff1a;摩尔精英作为行业内专业的IT/CAD技术服务团队&#xff0c;摩尔精英IT/CAD事业部曾于2019年11月21日的南京ICCAD大会上发表的《芯片设计云计算白皮书1.0》中&#xff0c;初步探索了基于公有云的EDA计算平台的实现方案。随着进一步的探索和方案优化&#xff0c;我…

c++中unordered_map的坑

unordered_map本身有hash表&#xff0c;不排序的情况下&#xff0c;对需要键值对的数据处理是比较方便的&#xff0c;存储、查找都很快了&#xff0c;但是如果不注意键值类型的话&#xff0c;有可能会掉坑的。 比如&#xff1a; unordered_map<string, vector<BigTestS…

课后作业-阅读任务-阅读笔记4

1.程序的质量体现在软件外在功能的质量 2.软件开发过程有三个主要的特性&#xff1a;好&#xff0c;快&#xff0c;便宜 3.CMMI有两种不同的实施方法&#xff0c;其级表示不同的内容&#xff1a; &#xff08;1&#xff09;连续式&#xff1a;主要是衡量一个企业在某一项目中的…

c#使用Path.Combine的一个坑

本想先解一个目录&#xff0c;再重组一个新目录存结果文件&#xff0c;想到用Path.Combine可以方便快捷&#xff0c;结果就遇见了坑&#xff0c; windows目录下有驱动器符号如“d:”&#xff0c;这时候使用Path.Combine并不会组成想要的路径&#xff1a; 理想状态下Path.Comb…

希尔伯特著名的第六问题 – 原来麦克斯韦早就有解?

转自&#xff1a;知社学术圈作者&#xff1a;Natalie Wolchover 编译&#xff1a;子聿希尔伯特的第六大问题号召人们公理化物理学定律&#xff0c;也就是说从一套初始假设或者公理的基础出发严格构建它们。这样做将会揭示需要不同公设的定律之间的矛盾。从相同的公理出发推导…

c++ tinyxml2 解析xml小坑

如题&#xff0c;项目中遇到的解析xml小坑&#xff1a; xml是python在windows下生成的&#xff0c;虽然是utf8的&#xff0c;但是回车是16进制显示的0D 0A&#xff0c;与linux下的回车不同&#xff08;0A&#xff09;&#xff0c;导致使用Parse函数时解析失败&#xff0c;查找…

96. Unique Binary Search Trees1和2

/*这道题的关键是&#xff1a;动态表尽量的选取&#xff0c;知道二叉搜索树中左子树的点都比根节点小&#xff0c;右子树的点都比根节点大所以当i为根节点&#xff0c;左子树有i-1个点&#xff0c;右子树有n-i个点&#xff0c;左右子树就可以开始递归构建&#xff0c;过程和一开…

python调用c++的库传递二级指针

遇见的问题&#xff1a;需要从python向c函数中传入二级指针的参数 char**P的问题&#xff1a; c_char_datas (ctypes.c_char_p * file_num)() for j in range(file_num):c_char (ctypes.c_char*6)()c_char.value file_list[j].name.encode(utf-8)c_char_datas[j] ctypes.…

编译tensorflow的小小记录

编译tensorflow有专门的编译工具bazel&#xff0c;所以需要先安装bazel。我使用的是源码编译bazel&#xff08;https://github.com/bazelbuild/bazel/releases&#xff09;。 第一个坑&#xff1a;git clone bazel源码或者使用下载的bazel-0.21.0.tar.gz&#xff0c;这种源码里…

layui富文本编译器添加图片

1、创建富文本编辑器 <form class"layui-form" method"post" id"myForm" enctype"multipart/form-data"><div class"layui-form-item layui-form-text"><label class"layui-form-label">内容&…

为什么数学是理解世界的最佳方式

来源&#xff1a;遇见数学在对着乔治梅森大学最近的一届新生致辞时&#xff0c;丽贝卡戈尔丁&#xff08;Rebecca Goldin&#xff09;传递了一个令人沮丧的数据&#xff1a;最近的一项研究显示&#xff0c;36%的大学生在大学四年时间里批判性思维并未显著提高。戈尔丁解释说&am…

windows查看dll库接口函数

一种是使用工具depends&#xff0c;另一种是使用vs的cmd命令窗口&#xff0c;dumpbin /EXPORTS xxx.dll就可以查看xxx.dll的函数接口了

bootstrap-table 行合并和列合并,以及固定列宽度等问题

列合并和列宽度固定&#xff1a; 1 .setWidth {2 table-layout: fixed;3 }4 5 .setWidth > thead > tr > th {6 width: 80px;7 }8 <table class"setWidth" id"EstateTable" data-mobile-responsive&…