文章系列
《ReactiveCocoa 概述》
《RACSignal》
《RACDisposable》
《RACSubject、RACReplaySubject(內(nèi)附冷信號和熱信號的區(qū)別)》
《集合RACTuple、RACSequence》
《RAC 中的通知、代理、KVO, 基本事件、方法的監(jiān)聽》
《rac_liftSelector》
《RACMulticastConnection》
《RACCommand》
《RAC - 核心方法bind》
《RAC - 定時器》
《RACScheduler》
《RAC - 點擊獲取驗證碼 demo》
《RAC - 映射(Map & flattenMap)》
《RAC信號操作解釋合集》
《RAC - 信號的生命周期》
mapReplace (替換)
將信號中的內(nèi)容全部替換為指定的
- (__kindof RACStream *)mapReplace:(nullable id)object;
reduceEach (變換)
信號必須發(fā)送的是一組值(RACTuple),通過reduceBlock接收一組值,然后處理返回一個值
- (__kindof RACStream *)reduceEach:(RACReduceBlock)reduceBlock;
filter (過濾)
fillter 返回一個BOOL變量,當(dāng)BOOL為true的使用才會返回信號, 否則就過濾掉了.
- (__kindof RACStream<ValueType> *)filter:(BOOL (^)(ValueType _Nullable value))block;
ignore (忽略)
忽略信號中的某些值
- (RACSignal<ValueType> *)ignore:(nullable ValueType)value;
take (提前終止)
實現(xiàn)原理是bind; 后面接數(shù)字,取前多少個值, 阻斷信號的執(zhí)行, 直接停止訂閱了.
- (__kindof RACStream<ValueType> *)take:(NSUInteger)count;
skip (跳過)
實現(xiàn)原理是bind; 跳過前幾次的值
- (__kindof RACStream<ValueType> *)skip:(NSUInteger)skipCount;
concat (連接)
把一組信號串聯(lián)起來,前面一個信號complete,后面一個信號才開始發(fā)揮作用, 連接在后面, 形成一個新的信號.
注: 不論哪個信號存在error , 到第一個error 就終止連接.
+ (__kindof RACStream<ValueType> *)concat:(id<NSFastEnumeration>)streams;
startWith (在前面增加量)
實現(xiàn)原理是concat, 在信號之前增加一個值, 也就是說在源信號之前先發(fā)送一個值.
- (__kindof RACStream<ValueType> *)startWith:(nullable ValueType)value;
repeat (重復(fù)增加)
當(dāng)信號發(fā)送complete的時候,重新訂閱, 反復(fù)增加原始數(shù)據(jù).
注: RACSignal 自己的方法. 若repeat 一個錯誤信息, 只repeat 一次就終止了.
- (RACSignal *)repeat ;
retry (反復(fù)重新添加)
發(fā)送error事件之后重試,重新訂閱, 即越到錯誤越來越勇, 反復(fù)訂閱, 反復(fù)開始, 一直不成功, 一直retry.
- (RACSignal<ValueType> *)retry;
- (RACSignal<ValueType> *)retry:(NSInteger)retryCount;
doNext (副作用操作)
作用: 用來往信號注入side effects, 顯示標記side effects的方法,在每次信號subscribeNext之前執(zhí)行.
不改變原value , 只是想干點啥, 比如打印.
- (RACSignal *)doNext:(void (^)(id x))block ;
collect (收集)
把信號所有的數(shù)據(jù)都存到一個數(shù)組里面, 等到complete事件的時候,把這個數(shù)組發(fā)出去. 原理是: 一連串操作的集合->經(jīng)過 aggregateWithStartFactory操作、defer操作、scanWithStart、bind等等(文中都有解釋)總之, 它的大致原理是:1、scanWithStart,前面我們解釋過,這個是使用block合并信號的前一個值和下一個值,返回一個新值的操作,初始值我們指定一個可變數(shù)組,block的操作是把下一個值添加到這個數(shù)組中來;2、takeLast操作來保證原始信號結(jié)束之后(complete)發(fā)送最近的一個結(jié)果。
注:要確保調(diào)用collect 的信號可以完結(jié), 否則得到的新信號將成為never 信號.
- (RACSignal*)collect;
aggregateWithStartFactory (加和操作)
- 偽遞歸操作
scanWithStart (掃描)
作用: 信號內(nèi)部信號全部掃描一遍, 做操作; 也就是使用reduceBlock從左到右合并receiver包含的值.
startingValue是第一個left值,信號的第一個值是right值,使用block進行合并,返回新值,以后的left是上一次合并之后的值,right是next的值,效果的疊加.
- (RACSignal *)scanWithStart:(nullable id)startingValue reduce:(id _Nullable (^)(id _Nullable running, ValueType _Nullable next))reduceBlock RAC_WARN_UNUSED_RESULT;
throttle (閥門)
每次發(fā)送的數(shù)據(jù),都經(jīng)過interval的間隔之后才發(fā)出。在interval時間內(nèi)發(fā)送的所有信號只有最后一個數(shù)據(jù)被發(fā)送,前面的都會被拋棄。
- (RACSignal<ValueType> *)throttle:(NSTimeInterval)interval RAC_WARN_UNUSED_RESULT;
merge (信號投射)
合并的信號的意思是,每個原始信號sendNext都會被當(dāng)作返回信號的一次值發(fā)送(基于bind,綁定).
按照時間順序平鋪投射到一個信號上, 受線程影響.
- (RACSignal *)merge:(RACSignal *)signal
zip (拉鏈)
類方法。它合并一組信號。必須任何一個信號都發(fā)送了一次值,合并后的信號才會把這幾個信號的同一批次的值封裝為RACTuple發(fā)送出去。例如合并兩個信號,第一個信號發(fā)了兩次1,2,第二個沒發(fā)送,那么不會有信號發(fā)出;如果第二個信號發(fā)送一次3,那么合并之后的信號會發(fā)送一個RACTuple(1,3),除非第二個信號在發(fā)送第二個值,第一個信號發(fā)送的第二個值才會被一起包裝作為一次信號發(fā)送出去。
+ (RACSignal<RACTuple *> *)zip:(id<NSFastEnumeration>)signals
combineLatest
兩個信號是否產(chǎn)生最新值, 打成tuple, 先結(jié)束的就終止了.
+ (RACSignal<RACTuple *> *)combineLatest:(id<NSFastEnumeration>)signals
takeUntil (通過信號B 來結(jié)束信號A)
原始信號一直發(fā)送信號,直到,替代的信號發(fā)出事件,原始信號終止.
例: 當(dāng)信號B有值時,信號A 終止訂閱.
switchToLatest
原始信號必須是發(fā)送信號的信號(sendNext:(RACSignal)…),發(fā)送的信號會被訂閱,直到發(fā)送下一個信號,前一個被發(fā)送的信號就終止訂閱,方法的作用是,每次訂閱最新的信號。和map一起往往被認為是替代flattenMap的方案.
.End