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

jopen 8年前發布 | 9K 次閱讀 SQL iOS開發 大數據 移動開發

前言

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

把范圍縮小到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"代表了集合中對象的一個實例屬性,此時集合中的對象是一個個的實體。

字符串區間

如 BEGINSWITH , ENDSWITH , CONTAINS ,顧名思義,我們可以很容易理解他們的過濾條件

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

來自: http://segmentfault.com/a/1190000004238379

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!