博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RAC(ReactiveCocoa)使用方法(二)
阅读量:6374 次
发布时间:2019-06-23

本文共 4516 字,大约阅读时间需要 15 分钟。

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

网络请求

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

////  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 
#import
#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
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];复制代码

详情见.

转载地址:http://punqa.baihongyu.com/

你可能感兴趣的文章
优化网站设计(三十):优化CSS sprites
查看>>
js 字符串操作函数集合
查看>>
悟透JavaScript
查看>>
nullnullCF 312B(Archer-等比数列极限求和)
查看>>
消息函数windows 程序设计 第三章 (下)
查看>>
java中调用web中的jsp或servlet去通知它们做一些操作
查看>>
Javascript 坦克大战
查看>>
JavaScript自动设置IFrame高度(兼容各主流浏览器)
查看>>
Linux内核中__init, __initdata, __initfunc(), asmlinkage, ENTRY(), FASTCALL()等作用
查看>>
leetcode -- Two Sum
查看>>
Windows多线程
查看>>
Resolve PSExec "Access is denied"
查看>>
C语言局部变量和全局变量问题汇总
查看>>
android 下的网络图片加载
查看>>
由浅入深探究mysql索引结构原理、性能分析与优化
查看>>
Paip.语义分析----情绪情感词汇表总结
查看>>
Linux下软件安装,卸载,管理
查看>>
基于注解风格的Spring-MVC的拦截器
查看>>
oracle加密-des 简单举例.
查看>>
翻译:SockJS-node文档(一)
查看>>