使用RAC实现KVO
- 创建Person类,添加两个属性name,age;给控制器添加一个UILabel以及一个person属性
#import <Foundation/Foundation.h>
@interface Person : NSObject
/** 姓名 */
@property (nonatomic, strong) NSString *name;
/** 年龄 */
@property (nonatomic, assign) NSInteger age;
@end
@interface ViewController ()
/** 展示Label */
@property (weak, nonatomic) IBOutlet UILabel *numberLabel;
/** person */
@property (nonatomic, strong) Person *person;
@end
- 创建person对象添加监听。
- (void)viewDidLoad {
[super viewDidLoad];
//创建person
self.person = [[Person alloc] init];
//添加监听person的属性变化
[RACObserve(self.person, name) subscribeNext:^(id _Nullable x) {
//设置label
self.numberLabel.text = x;
}];
}
- 在touchBegan方法中设置person的name属性
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
//点击屏幕设置numberLabel的text
self.person.name = [NSString stringWithFormat:@"lidong--%d",arc4random_uniform(1000)];
}
Simulator Screen Shot - iPhone 8 - 2018-01-01 at 20.54.10.png
Simulator Screen Shot - iPhone 8 - 2018-01-01 at 20.54.12.png
轻轻松松搞定
现在来带大家看一下RAC这个[RACObserve(self.person, name);宏内部代码
image.png
尴尬的我这个不太好看,见天新学的一招交个大家
image.png
呜呜呜。。。。使用的beta版一点开Xcode就炸了,这里先欠大家一张图大家自己试一下,滚到对应的代码处能够看到宏里面的具体代码。
使用RAC封装AFNetworking
- 正常使用
工具类的创建
//创建工具类单例
static NetworkTools *_networkTool;
+ (instancetype)sharedTools {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_networkTool = [[NetworkTools alloc] initWithBaseURL:nil];
_networkTool.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html" ,nil];
});
return _networkTool;
}
/** GET 请求 */
- (void)getReuestWithURL:(NSString *)URLString parameters:(id)parameters {
[self GET:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"成功——————%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"失败——————%@",error);
}];
}
工具类的使用
//创建网络请求
[[NetworkTools sharedTools] getReuestWithURL:@"http://www.weather.com.cn/data/sk/101010100.html" parameters:nil];
- RAC版本
get请求创建
/** GET 请求
将GET请求包装成信号,我们只需要早外部订阅就可以了
*/
- (RACSignal *)RACgetReuestWithURL:(NSString *)URLString parameters:(id)parameters {
return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[self GET:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"成功——————%@",responseObject);
//发送信号
[subscriber sendNext:responseObject];
//确保发送一次
[subscriber sendCompleted];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"失败——————%@",error);
//发送错误信号
[subscriber sendError:error];
}];
return nil;
}];
}
RAC版本的使用
//调用RACget请求
[[[NetworkTools sharedTools] RACgetReuestWithURL:@"http://www.weather.com.cn/data/sk/101010100.html" parameters:nil] subscribeNext:^(id _Nullable x) {
//请求成功的调用
NSLog(@"RAC___%@",x);
} error:^(NSError * _Nullable error) {
//请求失败的调用
NSLog(@"RAC___%@",error);
}];
- 解释一下RAC
我们在创建get请求的时候,创建信号,并且订阅了信号的两种情况一个是正常的信号,还有一个是发生错误的信号
正常的信号
//发送信号
[subscriber sendNext:responseObject];
错误的信号
//发送错误信号
[subscriber sendError:error];
在订阅信号时使用能够接受错误的方法
- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock error:(void (^)(NSError *error))errorBlock;
网友评论