小驢拉磨之—ReactiveCocao(RAC)實戰(一)

weixin_33978044發表於2018-01-01

使用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)];
}
2104514-f9cd1164dd21938d.png
Simulator Screen Shot - iPhone 8 - 2018-01-01 at 20.54.10.png
2104514-cf5e9be6bf4eaa58.png
Simulator Screen Shot - iPhone 8 - 2018-01-01 at 20.54.12.png

輕輕鬆鬆搞定
現在來帶大家看一下RAC這個[RACObserve(self.person, name);巨集內部程式碼


2104514-59ae7b6e6ade196d.png
image.png

尷尬的我這個不太好看,見天新學的一招交個大家


2104514-80f430867262ab72.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;

希望看過的朋友有問題給我留言,謝謝~~~

相關文章