美文网首页
小驴拉磨之—ReactiveCocao(RAC)实战(一)

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

作者: 小驴拉磨 | 来源:发表于2018-01-01 21:57 被阅读50次

    使用RAC实现KVO

    1. 创建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
    
    
    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<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

    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<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);
        }];
    
    1. 解释一下RAC
      我们在创建get请求的时候,创建信号,并且订阅了信号的两种情况一个是正常的信号,还有一个是发生错误的信号

    正常的信号

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

    错误的信号

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

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

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

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

    相关文章

      网友评论

          本文标题:小驴拉磨之—ReactiveCocao(RAC)实战(一)

          本文链接:https://www.haomeiwen.com/subject/boxxnxtx.html