(一)只取所需的filters
本段主要介紹rac訊息流的過濾器-filters類別的相關方法
rac中的filters
畫個範圍
乙個signal源可以產生一系列next值,但並非所有值都是需要的,具體的subscriber可以選擇在原有signal上套用filter操作來過濾掉不需要的值。
我的定義:rac中如果乙個operation將處理後的值集合是處理前值集合的子集,我們就可以把它歸為filter型別。
當然通過之前介紹的基礎操作完全可以自己拼出個想要的filter來,rac為了方便使用已經實現了幾個常用的filter,經過總結,這些filter大概可以分成兩類:next值過濾型別和起止點過濾型別。
值過濾型別filters
- filter: (bool (^)(id value))
rac中的filter同名方法- filter:(bool (^)(id value)),簡單明瞭,將乙個value用block做test,返回yes的才會通過,它的內部實現使用了- flattenmap:,將原來的signal經過過濾轉化成只返回過濾值的signal,用法也不難理解:
[[self.inputtextfield.rac_textsignal filter:^bool(nsstring *value) ] subscribenext:^(nsstring *value) ];
此外,還有幾個這個方法的衍生方法:
- ignore: (id)
忽略給定的值,注意,這裡忽略的既可以是位址相同的物件,也可以是- isequal:結果相同的值,也就是說自己寫的model物件可以通過重寫- isequal:方法來使- ignore:生效。常用的值的判斷沒有問題,如下:
[[self.inputtextfield.rac_textsignal ignore:@"sunny"] subscribenext:^(nsstring *value) ];
- ignorevalues
這個比較極端,忽略所有值,只關心signal結束,也就是只取comletion和error兩個訊息,中間所有值都丟棄。
注意,這個操作應該出現在signal有終止條件的的情況下,如rac_textsignal這樣除dealloc外沒有終止條件的signal上就不太可能用到。
- distinctuntilchanged
也是乙個相當常用的filter(但它不是- filter:的衍生方法),它將這一次的值與上一次做比較,當相同時(也包括- isequal:)被忽略掉。
比如ui上乙個label繫結了乙個值,根據值更新顯示的內容:
rac(self.label, text) = [racobserve(self.user, username) distinctuntilchanged];self.user.username = @"sunnyxx"; // 1st
self.user.username = @"sunnyxx"; // 2nd
self.user.username = @"sunnyxx"; // 3rd
如果不增加distinctuntilchanged的話對於連續的相同的輸入值就會有不必要的處理,這個栗子只是簡單的ui重新整理,但遇到如寫資料庫,發網路請求的情況時,代價就不能購忽略了。
所以,對於相同值可以忽略的情況,果斷加上它吧。
起止點過濾型別
除了被動的當next值來的時候做判斷,也可以主動的提前選擇開始和結束條件,分為兩種型別:take型(取)和 skip型(跳)
- take: (nsuinteger)
從開始一共取n次的next值,不包括competion和error,如:
[[[racsignal createsignal:^racdisposable *(id subscriber) ] take:2] subscribenext:^(id x) ];
- takelast: (nsuinteger)
取最後n次的next值,注意,由於一開始不能知道這個signal將有多少個next值,所以rac實現它的方法是將所有next值都存起來,然後原signal完成時再將後n個依次傳送給接收者,但error發生時依然是立刻傳送的。
- takeuntil:(racsignal *)
當給定的signal完成前一直取值。最簡單的栗子就是uitextfield的rac_textsignal的實現(刪減版本):
- (racsignal *)rac_textsignal ]takeuntil:self.rac_willdeallocsignal] // bingo!
}
也就是這個signal一直到textfield執行dealloc時才停止
- takeuntilblock:(bool (^)(id x))
對於每個next值,執行block,當block返回yes時停止取值,如:
[[self.inputtextfield.rac_textsignal takeuntilblock:^bool(nsstring *value) ] subscribenext:^(nsstring *value) ];
- takewhileblock:(bool (^)(id x))
上面的反向邏輯,對於每個next值,block返回 yes時才取值
- skip:(nsuinteger)
從開始跳過n次的next值,簡單的例子:
[[[racsignal createsignal:^racdisposable *(id subscriber) ] skip:1] subscribenext:^(id x) ];- skipuntilblock:(bool (^)(id x))
和- takeuntilblock:同理,一直跳,直到block為yes
- skipwhileblock:(bool (^)(id x))
和- takewhileblock:同理,一直跳,直到block為no
總結
本節介紹了rac中filter型別的operation,總結一下:
適用場景:需要乙個next值集合的子集時
filter型別:值過濾型和起止點過濾型
值過濾型常用方法: -filter:,-ignore:,-distinctunitlchanged
起止點過濾型常用方法:take系列和skip系列
wap html 知識點整理(持續更新)
wap html 知識點整理 持續更新 px為固定大小 em rem為相對大小,其中em相對其父節點,rem相對html根節點 在把px轉換成rem的過程中,會在設定html的css的font size為62.5 已使得在進行px到rem的轉換中1rem 10px。但是這種方式在chrome中不起作...
SVM知識點整理(持續更新 )
1.svm的原理是什麼?svm是一種二類分類模型。它的基本模型是在特徵空間中尋找間隔最大化的分離超平面的線性分類器。間隔最大是它有別於感知機 1 當訓練樣本線性可分時,通過硬間隔最大化,學習乙個線性分類器,即線性可分支援向量機 2 當訓練資料近似線性可分時,引入鬆弛變數,通過軟間隔最大化,學習乙個線...
機器學習 演算法面試知識點整理(持續更新中 )
1 監督學習 supervisedlearning 有類別標籤的學習,基於訓練樣本的輸入 輸出訓練得到最優模型,再使用該模型 新輸入的輸出 代表演算法 決策樹 樸素貝葉斯 邏輯回歸 knn svm 神經網路 隨機森林 adaboost 遺傳演算法 2 半監督學習 semi supervisedlea...