rac2

ReactiveCocoa操作方法之映射(flattenMap,Map)
flattenMap,Map用于把源信號內(nèi)容映射成新的內(nèi)容。

map簡單使用:

RACSubject *subject = [RACSubject subject];
    
    RACSignal *bindSignal = [subject map:^id(id value) {
        
        return [NSString stringWithFormat:@"SWL:%@",value];
        
    }];
    
    [bindSignal subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
    
    [subject sendNext:@"111"];

flattenMap簡單使用:

RACSubject *signalOfSignal = [RACSubject subject];
    
    RACSubject *signal = [RACSubject subject];
    //方式一
//    [signalOfSignal subscribeNext:^(RACSignal *x) {
//        [x subscribeNext:^(id x) {
//            NSLog(@"%@",x);
//        }];
//    }];
    //方式二
//    [[signalOfSignal switchToLatest]subscribeNext:^(id x) {
//        NSLog(@"%@",x);
//    }];
    //方式三
    [[signalOfSignal flattenMap:^RACStream *(id value) {
        return value;
    }]subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
   
    [signalOfSignal sendNext:signal];
    [signal sendNext:@"111"];

signalOfsignals用FlatternMap

FlatternMap和Map的區(qū)別

1.FlatternMap中的Block返回信號。
2.Map中的Block返回對象。
3.開發(fā)中,如果信號發(fā)出的值不是信號,映射一般使用Map
4.開發(fā)中,如果信號發(fā)出的值是信號,映射一般使用FlatternMap。

ReactiveCocoa操作方法之組合

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

- (void)viewDidLoad {
    [super viewDidLoad];
    
    RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        //偽代碼:發(fā)送頂部請求
        [subscriber sendNext:@"頂部數(shù)據(jù)"];
        [subscriber sendCompleted];
        return nil;
    }];
    
    RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        //偽代碼:發(fā)送底部請求
        [subscriber sendNext:@"底部數(shù)據(jù)"];
        return nil;
    }];
    //創(chuàng)建組合信號 關(guān)鍵字concat:按順序去連接
    //注意:第一個信號一定要調(diào)用sendCompleted
    RACSignal *concatSignal = [signalA concat:signalB];
    //訂閱組合信號
    [concatSignal subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
}

then:用于連接兩個信號,當(dāng)?shù)谝粋€信號完成,才會連接then返回的信號。(會忽略第一個信號的所有值)

- (void)viewDidLoad {
    [super viewDidLoad];
    
    RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        //偽代碼:發(fā)送頂部請求
        [subscriber sendNext:@"頂部數(shù)據(jù)"];
        [subscriber sendCompleted];
        return nil;
    }];
    
    RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        //偽代碼:發(fā)送底部請求
        [subscriber sendNext:@"底部數(shù)據(jù)"];
        return nil;
    }];
    
    //創(chuàng)建組合信號
    //then:忽略掉第一個信號所有值
    RACSignal *thenSignal = [signalA then:^RACSignal *{
        //返回信號就是需要組合的信號
        return signalB;
    }];
    
    //訂閱信號
    [thenSignal subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
}

merge:把多個信號合并為一個信號,任何一個信號有新值的時候就會調(diào)用

- (void)viewDidLoad {
    [super viewDidLoad];
    
    RACSubject *signalA = [RACSubject subject];
    RACSubject *signalB = [RACSubject subject];
    //創(chuàng)建組合信號
    RACSignal *mergeSignal = [signalA merge:signalB];
    //訂閱組合信號
    [mergeSignal subscribeNext:^(id x) {
        //任意一個信號發(fā)送內(nèi)容都會來這個block
        NSLog(@"%@",x);
    }];
    //發(fā)送
    [signalA sendNext:@"111"];
    [signalB sendNext:@"222"];
}

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

- (void)viewDidLoad {
    [super viewDidLoad];
    
    RACSubject *signalA = [RACSubject subject];
    RACSubject *signalB = [RACSubject subject];
    
    //壓縮成一個信號
    //zipWith:當(dāng)一個界面多個請求的時候,要等所有請求完成才能更新ui
    RACSignal *zipSignal = [signalA zipWith:signalB];
    [zipSignal subscribeNext:^(id x) {
        //zipWith:等所有信號都發(fā)送內(nèi)容的時候才調(diào)用
        NSLog(@"%@",x);
    }];
    
    [signalB sendNext:@"2"];
    [signalA sendNext:@"1"];
    //打印結(jié)果:
    //<RACTuple: 0x6000000077c0> (
    //1,
    //2
    //)
}

combineLatest reduce先組合在聚合:


- (void)viewDidLoad {
    //需求:登陸賬號和密碼都有值,登陸按鈕可點
    [super viewDidLoad];
    //先組合 在聚合
    //combineLatest:組合哪些信號  reduce:聚合
    RACSignal *combineSignal = [RACSignal combineLatest:@[[_accountField rac_textSignal],[_passwordField rac_textSignal]] reduce:^id(NSString *account,NSString *password){//block的參數(shù)和組合的信號一一對應(yīng)
        //聚合的值就是組合信號的內(nèi)容
        //block調(diào)用時刻:只要源信號發(fā)送內(nèi)容就回調(diào)用
        return @(account.length && password.length);
    }];
    
//    [combineSignal subscribeNext:^(id x) {
//        _loginButton.enabled = [x boolValue];
//    }];
    RAC(_loginButton,enabled) = combineSignal;
}

ReactiveCocoa操作方法之過濾

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

- (void)viewDidLoad {
    [super viewDidLoad];
    //只有當(dāng)文本框內(nèi)容長度大于5,才獲取文本框的內(nèi)容
    [[[_accountField rac_textSignal]filter:^BOOL(id value) {
        //value:源信號的內(nèi)容
        //返回值:就是過濾條件,只有滿足這個條件,才能獲取到內(nèi)容
        return [value length] > 5;
    }]subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
}

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

- (void)viewDidLoad {
    [super viewDidLoad];
    RACSubject *subject = [RACSubject subject];
    RACSignal *ignoreSignal = [subject ignore:@"1"];
    //ignoreValues:忽略所有值
//    RACSignal *ignoreSignal = [subject ignoreValues];
    [ignoreSignal subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
    [subject sendNext:@"1"];
    [subject sendNext:@"2"];
    //打印結(jié)果:2
}

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

- (void)viewDidLoad {
    [super viewDidLoad];
    RACSubject *subject = [RACSubject subject];
    [[subject take:1]subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
    [subject sendNext:@"1"];
    [subject sendNext:@"2"];
    //打印結(jié)果:1
}

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

- (void)viewDidLoad {
    [super viewDidLoad];
    RACSubject *subject = [RACSubject subject];
    //takeLast:取后面多少個值,必須要發(fā)送完成
    [[subject takeLast:2]subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
    [subject sendNext:@"1"];
    [subject sendNext:@"2"];
    [subject sendNext:@"3"];
    [subject sendCompleted];
    //打印結(jié)果:2 3
}

takeUntil:只要傳入信號發(fā)送完成或者發(fā)送任意數(shù)據(jù),就不會在接受源信號的內(nèi)容

- (void)viewDidLoad {
    [super viewDidLoad];
    RACSubject *subject = [RACSubject subject];
    RACSubject *signal = [RACSubject subject];
    [[subject takeUntil:signal]subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
    [subject sendNext:@"1"];

    [signal sendCompleted];
    //[signal sendNext:@"a"];

    [subject sendNext:@"2"];
    [subject sendNext:@"3"];
    //打印結(jié)果:1
}

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

- (void)viewDidLoad {
    [super viewDidLoad];
    RACSubject *subject = [RACSubject subject];
    [[subject distinctUntilChanged]subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
    [subject sendNext:@"1"];
    [subject sendNext:@"1"];
    [subject sendNext:@"2"];
    //打印結(jié)果:1 2
}

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

- (void)viewDidLoad {
    [super viewDidLoad];
    RACSubject *subject = [RACSubject subject];
    [[subject skip:2]subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
    [subject sendNext:@"1"];
    [subject sendNext:@"2"];
    [subject sendNext:@"3"];
    //打印結(jié)果:3
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • RAC使用測試Demo下載:github.com/FuWees/WPRACTestDemo 1.ReactiveC...
    FuWees閱讀 6,653評論 3 10
  • 1.ReactiveCocoa常見操作方法介紹1.1 ReactiveCocoa操作須知所有的信號(RACSign...
    IIronMan閱讀 2,688評論 2 17
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,602評論 19 139
  • 1.ReactiveCocoa常見操作方法介紹。 1.1 ReactiveCocoa操作須知 所有的信號(RACS...
    萌芽的冬天閱讀 1,144評論 0 5
  • 又一件惡性傷醫(yī)的慘案 剛剛看到了廣東省人民醫(yī)院發(fā)表的沉痛哀告。 最初知道這個消息還是熱門微博的推薦,叫一個有點良心...
    陌生小姐閱讀 834評論 1 4

友情鏈接更多精彩內(nèi)容