記錄ReactiveObjC的一些用法

常見用法

  • rac_signalForSelector : 代替代理
  • rac_valuesAndChangesForKeyPath: KVO
  • rac_signalForControlEvents:監(jiān)聽事件
  • rac_addObserverForName 代替通知
  • rac_textSignal:監(jiān)聽文本框文字改變
  • rac_liftSelector:withSignalsFromArray:Signals:當傳入的Signals(信號數(shù)組),每一個signal都至少sendNext過一次,就會去觸發(fā)第一個selector參數(shù)的方法。

常見宏

  • RAC(TARGET, [KEYPATH, [NIL_VALUE]]):用于給某個對象的某個屬性綁定
  • RACObserve(self, name) :監(jiān)聽某個對象的某個屬性,返回的是信號。
  • @weakify(Obj)和@strongify(Obj)
  • RACTuplePack :把數(shù)據(jù)包裝成RACTuple(元組類)
  • RACTupleUnpack:把RACTuple(元組類)解包成對應的數(shù)據(jù)
  • RACChannelTo 用于雙向綁定的一個終端

常用操作方法

  • flattenMap map 用于把源信號內容映射成新的內容。

  • concat 組合 按一定順序拼接信號,當多個信號發(fā)出的時候,有順序的接收信號

  • then 用于連接兩個信號,當?shù)谝粋€信號完成,才會連接then返回的信號。

  • merge 把多個信號合并為一個信號,任何一個信號有新值的時候就會調用

  • zipWith 把兩個信號壓縮成一個信號,只有當兩個信號同時發(fā)出信號內容時,并且把兩個信號的內容合并成一個元組,才會觸發(fā)壓縮流的next事件。

  • combineLatest:將多個信號合并起來,并且拿到各個信號的最新的值,必須每個合并的signal至少都有過一次sendNext,才會觸發(fā)合并的信號。

  • reduce聚合:用于信號發(fā)出的內容是元組,把信號發(fā)出元組的值聚合成一個值

  • filter:過濾信號,使用它可以獲取滿足條件的信號.

  • ignore:忽略完某些值的信號.

  • distinctUntilChanged:當上一次的值和當前的值有明顯的變化就會發(fā)出信號,否則會被忽略掉。

  • take:從開始一共取N次的信號

  • takeLast:取最后N次的信號,前提條件,訂閱者必須調用完成,因為只有完成,就知道總共有多少信號.

  • takeUntil:(RACSignal *):獲取信號直到某個信號執(zhí)行完成

  • skip:(NSUInteger):跳過幾個信號,不接受。

  • switchToLatest:用于signalOfSignals(信號的信號),有時候信號也會發(fā)出信號,會在signalOfSignals中,獲取signalOfSignals發(fā)送的最新信號。

  • doNext: 執(zhí)行Next之前,會先執(zhí)行這個Block

  • doCompleted: 執(zhí)行sendCompleted之前,會先執(zhí)行這個Block

  • timeout:超時,可以讓一個信號在一定的時間后,自動報錯。

  • interval 定時:每隔一段時間發(fā)出信號

  • delay 延遲發(fā)送next。

  • retry重試 :只要失敗,就會重新執(zhí)行創(chuàng)建信號中的block,直到成功.

  • replay重放:當一個信號被多次訂閱,反復播放內容

  • throttle節(jié)流:當某個信號發(fā)送比較頻繁時,可以使用節(jié)流,在某一段時間不發(fā)送信號內容,過了一段時間獲取信號的最新內容發(fā)出。

RACSequence和RACTuple簡單使用 遍歷數(shù)組或字典

// 1.遍歷數(shù)組
    NSArray *numbers = @[@1,@2,@3,@4];
 
    // 這里其實是三步
    // 第一步: 把數(shù)組轉換成集合RACSequence numbers.rac_sequence
    // 第二步: 把集合RACSequence轉換RACSignal信號類,numbers.rac_sequence.signal
    // 第三步: 訂閱信號,激活信號,會自動把集合中的所有值,遍歷出來。
    [numbers.rac_sequence.signal subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
 
 
    // 2.遍歷字典,遍歷出來的鍵值對會包裝成RACTuple(元組對象)
    NSDictionary *dict = @{@"name":@"xmg",@"age":@18};
    [dict.rac_sequence.signal subscribeNext:^(RACTuple *x) {
 
        // 解包元組,會把元組的值,按順序給參數(shù)里面的變量賦值
        RACTupleUnpack(NSString *key,NSString *value) = x;
 
        // 相當于以下寫法
//        NSString *key = x[0];
//        NSString *value = x[1];
        NSLog(@"%@ %@",key,value);
    }];
 
    // 3.字典轉模型
    // 3.1 OC寫法
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"flags.plist" ofType:nil];
    NSArray *dictArr = [NSArray arrayWithContentsOfFile:filePath];
    NSMutableArray *items = [NSMutableArray array];
 
    for (NSDictionary *dict in dictArr) {
        FlagItem *item = [FlagItem flagWithDict:dict];
        [items addObject:item];
    }
 
    // 3.2 RAC寫法
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"flags.plist" ofType:nil];
    NSArray *dictArr = [NSArray arrayWithContentsOfFile:filePath];
    NSMutableArray *flags = [NSMutableArray array];
 
    _flags = flags;
 
    // rac_sequence注意點:調用subscribeNext,并不會馬上執(zhí)行nextBlock,而是會等一會。
    [dictArr.rac_sequence.signal subscribeNext:^(id x) {
        // 運用RAC遍歷字典,x:字典
        FlagItem *item = [FlagItem flagWithDict:x];
        [flags addObject:item];
    }];
 
    NSLog(@"%@",  NSStringFromCGRect([UIScreen mainScreen].bounds));
 
    // 3.3 RAC高級寫法:
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"flags.plist" ofType:nil];
 
    NSArray *dictArr = [NSArray arrayWithContentsOfFile:filePath];
    // map:映射的意思,目的:把原始值value映射成一個新值
    // array: 把集合轉換成數(shù)組
    // 底層實現(xiàn):當信號被訂閱,會遍歷集合中的原始值,映射成新值,并且保存到新的數(shù)組里。
    NSArray *flags = [[dictArr.rac_sequence map:^id(id value) {
        return [FlagItem flagWithDict:value];
    }] array];

RACCommand簡單使用

RACCommand使用步驟:

 1.創(chuàng)建命令
    RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
        NSLog(@"執(zhí)行命令");
        // 創(chuàng)建空信號,必須返回信號
        //        return [RACSignal empty];
 
        // 2.創(chuàng)建信號,用來傳遞數(shù)據(jù)
        return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            [subscriber sendNext:@"請求數(shù)據(jù)"];
            // 注意:數(shù)據(jù)傳遞完,最好調用sendCompleted,這時命令才執(zhí)行完畢。
            [subscriber sendCompleted];
            return nil;
        }];
    }];
 
    // 強引用命令,不要被銷毀,否則接收不到數(shù)據(jù)
    _conmmand = command;
 
    // 3.訂閱RACCommand中的信號
    [command.executionSignals subscribeNext:^(id x) {
        [x subscribeNext:^(id x) {
            NSLog(@"%@",x);
        }];
    }];
 
    // RAC高級用法
    // switchToLatest:用于signal of signals,獲取signal of signals發(fā)出的最新信號,也就是可以直接拿到RACCommand中的信號
    [command.executionSignals.switchToLatest subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
 
    // 4.監(jiān)聽命令是否執(zhí)行完畢,默認會來一次,可以直接跳過,skip表示跳過第一次信號。
    [[command.executing skip:1] subscribeNext:^(id x) {
        if ([x boolValue] == YES) {
            // 正在執(zhí)行
            NSLog(@"正在執(zhí)行");
        }else{
            // 執(zhí)行完成
            NSLog(@"執(zhí)行完成");
        }
    }];
   // 5.執(zhí)行命令
    [self.conmmand execute:@1];

3.處理多個請求,都返回結果的時候,統(tǒng)一做處理.

    RACSignal *request1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
 
        // 發(fā)送請求1
        [subscriber sendNext:@"發(fā)送請求1"];
        return nil;
    }];
 
    RACSignal *request2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // 發(fā)送請求2
        [subscriber sendNext:@"發(fā)送請求2"];
        return nil;
    }];
 
    // 使用注意:幾個信號,參數(shù)一的方法就幾個參數(shù),每個參數(shù)對應信號發(fā)出的數(shù)據(jù)。
    [self rac_liftSelector:@selector(updateUIWithR1:r2:) withSignalsFromArray:@[request1,request2]];

}

// 更新UI
- (void)updateUIWithR1:(id)data r2:(id)data1
{
    NSLog(@"更新UI%@  %@",data,data1);
}

分別摘錄至
iOS 最全ReactiveCocoa原理及使用方法
ReactiveCocoa 最全常用API整理

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

相關閱讀更多精彩內容

  • 冬天,從學校到家的路上,風伴著落葉,雖是枯萎的葉子,但它飛落到地面的樣子,卷啊卷,飄啊飄,美到不能眨眼。太陽也好得...
    茜與詩酒間閱讀 681評論 6 15

友情鏈接更多精彩內容