使用謂詞(NSPredicate)來提升集合遍歷與過濾查找的效率

前言

在開發中,咱們常常會遇到一些須要,讓咱們從集合中查找某個值,從集合中過濾想要的內容等等,於是咱們就須要遍歷集合,加條件判斷,而後獲取符合條件的值。而關於集合的遍歷是全部軟件開發從業人員常常打交道的一些事情。正則表達式

把範圍縮小到iOS開發中,關於集合地遍歷的方法就有好多種,人們一直在討論和爭辯,想尋找出一種最快最有效的方法,是用for循環,仍是block,是用併發操做,仍是順序操做,等等。甚至有人不惜使用大數據量來測試各類遍歷方式的效率以及精確度併發

然而我認爲尋找並選擇一種本身認爲合適的操做是最好的,簡單地幾個數據的集合,就用到普通的for循環,基於大數據量的遍歷就須要用到併發操做。框架

NSPredicate
而我並不會在這裏展現如何遍歷集合,而是提示一種在iOS開發中,用一種相似於SQL語句來過濾集合內容的方式從而避免了本身進行集合遍歷的方法,就是NSPredicate。蘋果在Cocoa touch框架給咱們提供了NSPredicate這個類,封裝了一些讓咱們能夠直接對集合設置過濾條件的方法,而至於蘋果是如何在SDK中進行數據查找地,咱們並不須要關心,由於我相信它作的必定比咱們好。學過SQL語法的人,使用NSPredicate會十分容易。我會在下面的內容中詳細的講述NSPredicate的語法規則。測試

符號表達式

如<, >, == , !=, 等等這些數學符號表達式,在NSPredicate的format中依然有效大數據

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"SELF > 10"];

"SELF"表明的時集合中的對象自己,此時集合對象是整型數據,在iOS中的集合能夠是nil以外的任何數據類型。code

範圍表示

IN,BETWEEN等等這種表明範圍區間的格式字符串,能夠形象地稱之爲關鍵字orm

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"age BETWEEN {1,5}"];

"age"表明了集合中對象的一個實例屬性,此時集合中的對象是一個個的實體。對象

字符串區間

BEGINSWITHENDSWITHCONTAINS,顧名思義,咱們能夠很容易理解他們的過濾條件開發

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@",text];

在格式化語言中,咱們仍然能夠自如地使用」%@「等符號表示變量。[cd]中的c表示不區分大小寫,d表示不區分發音符號。字符串

通配符

LIKE,這些與SQL語義中的關鍵字定義十分相像。

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"name LIKE[cd] '*er'"];

在NSPredicate格式串中,是自動給字符串加上引號的,因此咱們自定義的字符串必須加上引號(單/雙)

正則匹配

MATCHES,諸如其餘的查找語言,都是須要匹配正則表達式的

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"name MATCHES 'Z.+e$'"];

組合查詢

AND,在設置過濾條件時,可能單一條件並不能知足咱們的須要,因此咱們就須要設置組合條件

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"name LIKE[cd] '*er'" AND age > 10];
相關文章
相關標籤/搜索