ReactiveCocoa的流和序列

2018-08-01 14:28 更新

ReactiveCocoa中的流是值的序列化的抽象,一個(gè)流可以被當(dāng)成一條通道,而值就是通道中傳輸?shù)奈镔|(zhì),值從通道的一頭進(jìn)入再?gòu)牧硪活^出來(lái)。只要值從通道的另一頭流出來(lái)了,我們就可以對(duì)過(guò)去的所有值進(jìn)行讀取,對(duì)于剛剛進(jìn)入通道的值(即當(dāng)前值)也是可以讀取的。還有比較難理解的就是值的序列化了,那么按照我們當(dāng)前的理解程度來(lái)說(shuō),它像是一個(gè)數(shù)組、一個(gè)列表。

事實(shí)上,使用rac_sequeuece我們能夠輕松地將數(shù)組轉(zhuǎn)化為一個(gè)流:

NSArray *array = @[ @1, @2, @3 ];
RACSequence * stream = [array rac_sequence];

等一下!Sequences?我以為我們?cè)谔幚?code>Stream? 好吧,說(shuō)明一下,Sequences是兩種特定類(lèi)型的流的一種,實(shí)際上,RACSequence是一個(gè)RACStream的子類(lèi)。 我們能用流做什么呢?好吧,我將使用流來(lái)展示上一章中提到的例子。應(yīng)用在平方數(shù)映射上:

[stream map:^id (id value){
    return @(pow([value integerValue], 2));
}];

注意,跟數(shù)組一樣,流不能包含nil元素。[譯者注:NSArray中以nil作為結(jié)束標(biāo)示,stream也一樣]。 非常好!但是流映射后還是流,我們?cè)趺礃硬拍艿玫綌?shù)組呢?幸運(yùn)的是,RACSequence有一個(gè)方法返回?cái)?shù)組:array。

NSLog(@"%@",[stream array]);

這會(huì)打印映射后的數(shù)組。比起直接使用RXCollections這多出了幾個(gè)步驟,但這里我只想說(shuō)明使用流也可以達(dá)成任務(wù)。

當(dāng)然,我們可以合并上面的方法調(diào)用來(lái)避免污染變量的作用域.

NSLog(@"%@",[[[array rac_sequence] map:^id (id value){
                    return @(pow([value integerValue], 2));
                }] array]);

總的來(lái)說(shuō),我們做了這樣的事情:

  • 將數(shù)組轉(zhuǎn)化成一個(gè)序列類(lèi)型的流。
  • 對(duì)流進(jìn)行映射得到一個(gè)新的流。
  • 將新的流轉(zhuǎn)為數(shù)組。

序列,默認(rèn)情況下是延遲加載的(也稱(chēng):懶加載或被動(dòng)加載),是pull-driven的,在他們被生成的時(shí)候就會(huì)提供確切的值,而數(shù)組方法會(huì)強(qiáng)制給序列的每一個(gè)成員賦值。

我們來(lái)看一下filtering。為了使用ReactiveCocoa來(lái)過(guò)濾我們的數(shù)組,我們需要再一次把它序列化以便于使用過(guò)濾。

NSLog(@"%@", [[[array rac_sequence] filter:^BOOL (id value){
                        return [value integerValue] % 2 == 0;
                    }] array]);

最后看一下怎么讓一個(gè)序列流合并為單個(gè)值(folding):

NSLog(@"%@",[[[array rac_sequence] map:^id (id value){
                    return [value stringValue];
                }] foldLeftWithStart:@"" reduce:^id (id accumulator, id value){
                    return [accumulator stringByAppendingString:value];
            }]);

這種情況下,我們?cè)谛蛄猩线M(jìn)行了鏈?zhǔn)秸{(diào)用,當(dāng)我們討論下一節(jié)'信號(hào)'的時(shí)候,(鏈?zhǔn)秸{(diào)用)是一個(gè)關(guān)鍵的概念。

ReactiveCocoa具有左折疊和右折疊的概念。左折疊時(shí)折疊算法將從頭到尾遍歷數(shù)組,反之稱(chēng)為右折疊。這樣的命名(即左、右折疊)暗示了編程語(yǔ)言對(duì)列表的理解,這種概念在Objective-C中是沒(méi)有的。

確定你現(xiàn)在已經(jīng)理解了到此為止我們所說(shuō)的內(nèi)容,因?yàn)檫@對(duì)后面的講解內(nèi)容十分重要。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)