小驴拉磨之—ReactiveCocao(RAC)实战(一)

使用RAC实现KVO

  1. 创建Person类,添加两个属性name,age;给控制器添加一个UILabel以及一个person属性
#import 

@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

  1. 创建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;
    }];
    
}
  1. 在touchBegan方法中设置person的name属性
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    //点击屏幕设置numberLabel的text
    self.person.name = [NSString stringWithFormat:@"lidong--%d",arc4random_uniform(1000)];
}
小驴拉磨之—ReactiveCocao(RAC)实战(一)_第1张图片
Simulator Screen Shot - iPhone 8 - 2018-01-01 at 20.54.10.png
小驴拉磨之—ReactiveCocao(RAC)实战(一)_第2张图片
Simulator Screen Shot - iPhone 8 - 2018-01-01 at 20.54.12.png

轻轻松松搞定
现在来带大家看一下RAC这个[RACObserve(self.person, name);宏内部代码


小驴拉磨之—ReactiveCocao(RAC)实战(一)_第3张图片
image.png

尴尬的我这个不太好看,见天新学的一招交个大家


小驴拉磨之—ReactiveCocao(RAC)实战(一)_第4张图片
image.png

呜呜呜。。。。使用的beta版一点开Xcode就炸了,这里先欠大家一张图大家自己试一下,滚到对应的代码处能够看到宏里面的具体代码。

使用RAC封装AFNetworking

  1. 正常使用
    工具类的创建
//创建工具类单例
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];
  1. RAC版本
    get请求创建
/** GET 请求
 将GET请求包装成信号,我们只需要早外部订阅就可以了
 */
- (RACSignal *)RACgetReuestWithURL:(NSString *)URLString parameters:(id)parameters {
    return [RACSignal createSignal:^RACDisposable * _Nullable(id  _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);
    }];
  1. 解释一下RAC
    我们在创建get请求的时候,创建信号,并且订阅了信号的两种情况一个是正常的信号,还有一个是发生错误的信号

正常的信号

//发送信号
[subscriber sendNext:responseObject];

错误的信号

//发送错误信号
[subscriber sendError:error];

在订阅信号时使用能够接受错误的方法

- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock error:(void (^)(NSError *error))errorBlock;

希望看过的朋友有问题给我留言,谢谢~~~

你可能感兴趣的:(小驴拉磨之—ReactiveCocao(RAC)实战(一))