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

shaobo發表於2016-01-02

前言

在開發中,我們經常會遇到一些需要,讓我們從集合中查詢某個值,從集合中過濾想要的內容等等,因而我們就需要遍歷集合,加條件判斷,然後獲取符合條件的值。而關於集合的遍歷是所有軟體開發從業人員經常打交道的一些事情。

把範圍縮小到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之外的任何資料型別。

範圍表示

IN,BETWEEN等等這種代表範圍區間的格式字串,可以形象地稱之為關鍵字

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];

相關文章