99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

ReactiveCocoa的流和序列

2018-08-01 14:28 更新

ReactiveCocoa中的流是值的序列化的抽象,一個流可以被當成一條通道,而值就是通道中傳輸的物質,值從通道的一頭進入再從另一頭出來。只要值從通道的另一頭流出來了,我們就可以對過去的所有值進行讀取,對于剛剛進入通道的值(即當前值)也是可以讀取的。還有比較難理解的就是值的序列化了,那么按照我們當前的理解程度來說,它像是一個數組、一個列表。

事實上,使用rac_sequeuece我們能夠輕松地將數組轉化為一個流:

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

等一下!Sequences?我以為我們在處理Stream? 好吧,說明一下,Sequences是兩種特定類型的流的一種,實際上,RACSequence是一個RACStream的子類。 我們能用流做什么呢?好吧,我將使用流來展示上一章中提到的例子。應用在平方數映射上:

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

注意,跟數組一樣,流不能包含nil元素。[譯者注:NSArray中以nil作為結束標示,stream也一樣]。 非常好!但是流映射后還是流,我們怎么樣才能得到數組呢?幸運的是,RACSequence有一個方法返回數組:array

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

這會打印映射后的數組。比起直接使用RXCollections這多出了幾個步驟,但這里我只想說明使用流也可以達成任務。

當然,我們可以合并上面的方法調用來避免污染變量的作用域.

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

總的來說,我們做了這樣的事情:

  • 將數組轉化成一個序列類型的流。
  • 對流進行映射得到一個新的流。
  • 將新的流轉為數組。

序列,默認情況下是延遲加載的(也稱:懶加載或被動加載),是pull-driven的,在他們被生成的時候就會提供確切的值,而數組方法會強制給序列的每一個成員賦值。

我們來看一下filtering。為了使用ReactiveCocoa來過濾我們的數組,我們需要再一次把它序列化以便于使用過濾。

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

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

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

這種情況下,我們在序列上進行了鏈式調用,當我們討論下一節(jié)'信號'的時候,(鏈式調用)是一個關鍵的概念。

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

確定你現在已經理解了到此為止我們所說的內容,因為這對后面的講解內容十分重要。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號