ReactiveCocoa操作

map :映射

textField.rac_textSigal map:^id(NSString* value){

return @(value.length);

} subscribeNext:^(NSString* x){

NSLog(@“%@“,x);

}

打?。?/p>

0 ?1 ?2 ?3 ?4

filter : 過濾

textField.rac_textSigal filter:BOOL(NSString* value){

return value.length > 3;

}

delay: 延時

設(shè)置延時兩秒后發(fā)送消息

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

[subscriber sendNext:@“ricke”];

[subscriber sendCompleted];

return nil;

}] delay:2]

subscribeNext:^(id x){

NSLog(@“%@”,x);

}];

startWith: 在發(fā)送消息之前,先發(fā)送一個消息

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

[subscriber sendNext:@“next”];

[subscriber sendCompleted];

return nil;

}] startWith:@“RAC”]

subscriberNext:^(id x){

NSLog(@“%@”,x);

}];

timeout :超時

[[[RACSignalcreateSignal:^RACDisposable* (idsubscriber){

[[RACSchedulermainThreadScheduler]afterDelay:3schedule:^{

[subscribersendNext:@"sned"];

[subscribersendCompleted];

}];

returnnil;

}]timeout:2onScheduler:[RACSchedulermainThreadScheduler]]

subscribeNext:^(idx) {

NSLog(@"%@",x);

}];

take :發(fā)送多個消息的時候,取最前面的幾條

[[[RACSignalcreateSignal:^RACDisposable*(id subscriber) {

[subscribersendNext:@"1"];

[subscribersendNext:@"2"];

[subscribersendNext:@"3"];

[subscribersendNext:@"4"];

[subscribersendNext:@"5"];

[subscribersendCompleted];

returnnil;

}]take:2]

subscribeNext:^(idx) {

NSLog(@"%@",x);

}];

takelast : 發(fā)送多條消息的時候,取最后面的幾條

[[[RACSignalcreateSignal:^RACDisposable*(id subscriber) {

[subscribersendNext:@"1"];

[subscribersendNext:@"2"];

[subscribersendNext:@"3"];

[subscribersendNext:@"4"];

[subscribersendNext:@"5"];

[subscribersendNext:@"6"];

[subscribersendCompleted];

returnnil;

}]takeLast:3]

subscribeNext:^(idx) {

NSLog(@"%@",x);

}];

takeUntil :RACSignal (發(fā)送在takeUntil后面的信號完成前的消息)

//RAC這個消息是2秒后完成,所以1、2這兩個消息是可以發(fā)送到,而3秒后3、4就不會發(fā)送

[[[RACSignalcreateSignal:^RACDisposable*(id subscriber) {

[subscribersendNext:@"1"];

[subscribersendNext:@"2"];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3*NSEC_PER_SEC)),dispatch_get_main_queue(), ^{

[subscribersendNext:@"3"];

[subscribersendNext:@"4"];

[subscribersendCompleted];

});

[subscribersendCompleted];

returnnil;

}]takeUntil:[RACSignalcreateSignal:^RACDisposable*(id subscriber) {

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2*NSEC_PER_SEC)),dispatch_get_main_queue(), ^{

[subscribersendNext:@"RAC"];

[subscribersendCompleted];

});

returnnil;

}]]

subscribeNext:^(idx) {

NSLog(@"%@",x);

}];

takeWhileBlock :但takeWhileBlock返回YES的時候發(fā)送消息

[[[RACSignalcreateSignal:^RACDisposable*(id subscriber) {

[subscribersendNext:@"1"];

[subscribersendNext:@"2"];

[subscribersendNext:@"3"];

[subscribersendNext:@"4"];

[subscribersendNext:@"5"];

[subscribersendCompleted];

returnnil;

}]takeWhileBlock:^BOOL(idx) {

returnYES;

}]

subscribeNext:^(idx) {

NSLog(@"%@",x);

}];

skip: 跳過

[[[RACSignalcreateSignal:^RACDisposable*(id subscriber) {

[subscribersendNext:@"1"];

[subscribersendNext:@"2"];

[subscribersendNext:@"3"];

[subscribersendNext:@"4"];

[subscribersendNext:@"5"];

[subscribersendNext:@"6"];

[subscribersendCompleted];

returnnil;

}]skip:2]

subscribeNext:^(idx) {

NSLog(@"%@",x);

}];

skipWhileBlock 和skipUntilBlock

skipWhileBlock :當block返回YES的時候跳過,返回NO的時候發(fā)送

skipUntilBlock:skipUntilBlock和skipWhileBlock相反,當block返回NO的時候跳,返回YES的時候發(fā)送

throttle (節(jié)流)優(yōu)化請求時間間隔

throttle: 設(shè)置一個間隔時間,當兩次信號之間的時間差小于這個時間就不會發(fā)送請求

[[textField.rac_textSignalthrottle:0.3]

subscribeNext:^(idx) {

NSLog(@"%@",x);

}];

distinctUntilChanged: 優(yōu)化請求字符一樣的時候(當后一個請求和錢一個請求一樣的時候,就可以不用請求)

[[[textField.rac_textSignalthrottle:0.3]distinctUntilChanged]

subscribeNext:^(idx) {

NSLog(@"%@",x);

}];

ignore : 忽略某些 例如上面的空字符

[[[[textField.rac_textSignalthrottle:0.3]distinctUntilChanged]ignore:@""]

subscribeNext:^(idx) {

NSLog(@"%@",x);

}];

switchToLatest : 當你請求數(shù)據(jù)的時候、網(wǎng)絡(luò)會有延遲,數(shù)據(jù)還沒有返回回來,這時候你發(fā)送了新的請求,則我們?nèi)∠耙淮蔚恼埱?,只發(fā)送最新的請求

[[[[[[textField.rac_textSignalthrottle:0.3]distinctUntilChanged]ignore:@""]

map:^id(idvalue) {

return[RACSignalcreateSignal:^RACDisposable*(id subscriber) {

[subscribersendNext:@"request"];

[subscribersendCompleted];

returnnil;

}];

}]switchToLatest]

subscribeNext:^(idx) {

NSLog(@"--request---%@",x);

}];

多個信號處理

merge :同時訂閱2個信號

RACSignal* signalA = [RACSignalcreateSignal:^RACDisposable*(id subscriber) {

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2*NSEC_PER_SEC)),dispatch_get_main_queue(), ^{

[subscribersendNext:@"SignalA"];

[subscribersendCompleted];

});

returnnil;

}];

RACSignal* signalB = [RACSignalcreateSignal:^RACDisposable*(id subscriber) {

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5*NSEC_PER_SEC)),dispatch_get_main_queue(), ^{

[subscribersendNext:@"signalB"];

[subscribersendCompleted];

});

returnnil;

}];

[[signalAmerge:signalB]subscribeNext:^(idx) {

NSLog(@"%@",x);

}];

concat

singleA 完成后才會訂閱signalB有點像串行隊列 A失敗了B就不會被訂閱

[[signalAconcat:signalB]subscribeNext:^(idx) {

NSLog(@"%@",x);

}];

zipWith 和 ?combineLatest: 每個信號都至少要發(fā)送一次才可以被訂閱

[[signalAzipWith:signalB]subscribeNext:^(idx) {

NSLog(@"%@",x);

}];

[[RACSignalcombineLatest:@[signalA,signalB]]subscribeNext:^(idx) {

NSLog(@"%@",x);

}];

RAC中的宏:

RAC(self.titleLabel,text) = [RACSignal interval:1onScheduler:[RACScheduler mainThreadScheduler]]map:^id(NSData* value) {

returnvalue.description;

}

屬性監(jiān)聽

RACObserve(self.menuButton, enabled)

最后編輯于
?著作權(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有了一個基本的認識,了解了它的作用,以及RAC的運行機制,我們知道只要是信號(RACSignal...
    大大盆子閱讀 4,616評論 0 11
  • 1.ReactiveCocoa簡介 ReactiveCocoa(簡稱為RAC),是由Github開源的一個應(yīng)用于i...
    愛睡覺的魚閱讀 1,219評論 0 1
  • RAC使用測試Demo下載:github.com/FuWees/WPRACTestDemo 1.ReactiveC...
    FuWees閱讀 6,642評論 3 10
  • 1.ReactiveCocoa常見操作方法介紹。 1.1 ReactiveCocoa操作須知 所有的信號(RACS...
    萌芽的冬天閱讀 1,139評論 0 5
  • 又是一個陽光微撒的清晨,有夏季的熱和清晨的涼。懶洋洋的暖帶著粘粘的汗。 每天每一分每一秒我總是想太多。會從一句歌詞...
    920c59fde59f閱讀 244評論 0 0

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