RAC之RACCommand簡單學習

- (IBAction)test:(id)sender {

? ? [selftest5];

? ? return;

? ? // RACCommand: 處理事件

? ? // 不能返回空的信號

? ? // 1.創(chuàng)建命令

? ? RACCommand*command = [[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id? _Nullable input) {

?? ? ? //block調用,直行行命令的時候就會調用

? ? ? ? NSLog(@"執(zhí)行命令傳進來的參數(shù)==%@",input); // input 為執(zhí)行命令傳進來的參數(shù)


? ? ? ? return [RACSignal createSignal:^RACDisposable * _Nullable(id? _Nonnull subscriber) {

? ? ? ? ? ? [subscribersendNext:@"執(zhí)行命令產(chǎn)生的數(shù)據(jù)"];

? ? ? ? ? ? returnnil;

? ? ? ? }];

? ? }];

? ? // 如何拿到執(zhí)行命令中產(chǎn)生的數(shù)據(jù)呢?

? ? // 訂閱命令內部的信號

? ? // ** 方式一:直接訂閱執(zhí)行命令返回的信號


? ? // 2.執(zhí)行命令

? ? RACSignal *signal =[command execute:@{@"key":@2,@"key2":@3}]; // 這里其實用到的是replaySubject 可以先發(fā)送命令再訂閱

? ? // 在這里就可以訂閱信號了

? ? @weakify(self);

? ? [signalsubscribeNext:^(idx) {

? ? ? ? NSLog(@"%@",x);


? ? ? ? @strongify(self);

? ? ? ? self.contentL.text= x;

? ? }];


}

// RACCommand:RAC中用于處理事件的類,可以把事件如何處理,事件中的數(shù)據(jù)如何傳遞,包裝到這個類中,他可以很方便的監(jiān)控事件的執(zhí)行過程,比如看事件有沒有執(zhí)行完畢

// 使用場景:監(jiān)聽按鈕點擊,網(wǎng)絡請求

- (void)viewDidLoad {

? ? [super viewDidLoad];

? ? // Do any additional setup after loading the view.

}

// 方式二:

// 訂閱信號

// 注意:這里必須是先訂閱才能發(fā)送命令

// executionSignals:信號源,信號中信號,signalofsignals:信號,發(fā)送數(shù)據(jù)就是信號

-(void)test1{

? ? RACCommand*command= [[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id? _Nullable input) {

? ? ? ? NSLog(@"執(zhí)行命令傳進來的參數(shù)==%@",input); // input 為執(zhí)行命令傳進來的參數(shù)

? ? ? ? return [RACSignal createSignal:^RACDisposable * _Nullable(id? _Nonnull subscriber) {

? ? ? ? ? ? [subscribersendNext:@"產(chǎn)生的數(shù)據(jù)"];

? ? ? ? ? ? returnnil;

? ? ? ? }];

? ? }];

? ? @weakify(self);

? ? [command.executionSignals subscribeNext:^(RACSignal? *x) {

? ? ? ? [xsubscribeNext:^(id? _Nullablex) {

? ? ? ? ? ? NSLog(@"%@",x);


? ? ? ? ? ? @strongify(self);

? ? ? ? ? ? self.contentL.text= x;

? ? ? ? }];

? ? }];

? ? // 2.執(zhí)行命令

? ? [commandexecute:@2];


}

// 高級做法

- (void)test3 {


? ? // 1.創(chuàng)建命令

? ? RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {

? ? ? ? // block調用:執(zhí)行命令的時候就會調用

? ? ? ? NSLog(@"%@", input);

? ? ? ? // 這里的返回值不允許為nil

? ? ? ? return [RACSignal createSignal:^RACDisposable *(id subscriber) {

? ? ? ? ? ? [subscribersendNext:@"發(fā)送信號"];

? ? ? ? ? ? returnnil;

? ? ? ? }];

? ? }];


? ? // 方式三

? ? // switchToLatest獲取最新發(fā)送的信號,只能用于信號中信號。

? ? [command.executionSignals.switchToLatest subscribeNext:^(id x) {

? ? ? ? NSLog(@"%@", x);

? ? }];

? ? // 2.執(zhí)行命令

? ? [commandexecute:@3];


}

// switchToLatest

- (void)test4 {

? ? // 創(chuàng)建信號中信號

? ? RACSubject*signalofsignals = [RACSubjectsubject];

? ? RACSubject *signalA = [RACSubject subject];

? ? // 訂閱信號

? ? //? ? [signalofsignals subscribeNext:^(RACSignal *x) {

? ? //? ? ? ? [x subscribeNext:^(id x) {

? ? //? ? ? ? ? ? NSLog(@"%@", x);

? ? //? ? ? ? }];

? ? //? ? }];

? ? // switchToLatest: 獲取信號中信號發(fā)送的最新信號

? ? [signalofsignals.switchToLatestsubscribeNext:^(idx) {

? ? ? ? NSLog(@"%@", x);

? ? }];

? ? // 發(fā)送信號

? ? [signalofsignalssendNext:signalA];

? ? [signalAsendNext:@4];

}

// 監(jiān)聽事件有沒有完成

- (void)test5 {

? ? //注意:當前命令內部發(fā)送數(shù)據(jù)完成,一定要主動發(fā)送完成

? ? // 1.創(chuàng)建命令

? ? RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {

? ? ? ? // block調用:執(zhí)行命令的時候就會調用

? ? ? ? NSLog(@"%@", input);

? ? ? ? // 這里的返回值不允許為nil

? ? ? ? return [RACSignal createSignal:^RACDisposable *(id subscriber) {

? ? ? ? ? ? // 發(fā)送數(shù)據(jù)

? ? ? ? ? ? [subscribersendNext:@"執(zhí)行命令產(chǎn)生的數(shù)據(jù)"];


? ? ? ? ? ? // *** 發(fā)送完成 **

? ? ? ? ? ? [subscribersendCompleted];

? ? ? ? ? ? returnnil;

? ? ? ? }];

? ? }];

? ? // 監(jiān)聽事件有沒有完成

? ? [command.executing subscribeNext:^(id x) {

? ? ? ? if([xboolValue] ==YES) {// 正在執(zhí)行

? ? ? ? ? ? NSLog(@"當前正在執(zhí)行%@", x);

? ? ? ? }else{

? ? ? ? ? ? // 執(zhí)行完成/沒有執(zhí)行

? ? ? ? ? ? NSLog(@"執(zhí)行完成/沒有執(zhí)行");

? ? ? ? }

? ? }];


? ? // 2.執(zhí)行命令

? ? [commandexecute:@1];


}

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • RAC使用測試Demo下載:github.com/FuWees/WPRACTestDemo 1.ReactiveC...
    FuWees閱讀 6,658評論 3 10
  • RAC在iOS的實際開發(fā)中確實是一件有力的武器,此文將從以下幾方面講解 RACSignal RACSubject ...
    4b5cb36a2ee2閱讀 1,033評論 0 0
  • 前言 之前對RAC有了一個基本的認識,了解了它的作用,以及RAC的運行機制,我們知道只要是信號(RACSignal...
    大大盆子閱讀 4,627評論 0 11
  • 1、RACSignal // 只要訂閱者調用sendNext,就會執(zhí)行nextBlock // 只要訂閱RACD...
    路上撿只貓閱讀 1,043評論 0 1
  • 1.ReactiveCocoa簡介 ReactiveCocoa(簡稱為RAC),是由Github開源的一個應用于i...
    清蘂翅膀的技術閱讀 2,091評論 0 1

友情鏈接更多精彩內容