IOS NSPredicate - 加速數(shù)據(jù)處理

序言

NSPredicate 學(xué)名叫謂詞邏輯。提供一個(gè)篩選條件給它,它就可以在最短的時(shí)間內(nèi)篩選出你想要的。簡直快到?jīng)]朋友,甩for循環(huán)幾條街。

幾種常見的處理數(shù)據(jù)處理

  • 獲取字符串?dāng)?shù)組中長度大于3的元素
    //字符串?dāng)?shù)組
    NSArray *array = @[@"mally", @"lisa", @"shally"];
    
    //提供篩選條件獲取NSPredicate篩選器
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"length <= 4"];
    
    //按照條件過濾出想要的結(jié)果放到resultArr
    NSArray *resultArr = [array filteredArrayUsingPredicate:predicate];
length 是哪里來的?

數(shù)組中所有元素都是字符串,也就是NSString,而NSString 具有l(wèi)ength這個(gè)屬性。如果有其他需求,可以查看NSString 的屬性列表,根據(jù)需求寫篩選條件。

執(zhí)行過程是怎樣的?

篩選器(NSPredicate)會(huì)獲取到數(shù)組中的每一個(gè)元素(這里是字符串),執(zhí)行:self.length<=4 這個(gè)判斷條件,self是當(dāng)前執(zhí)行判斷的某個(gè)元素(這里是某個(gè)字符串)。將符合條件的過濾到一個(gè)新的數(shù)組。全部篩選完畢后,返回這個(gè)新的數(shù)組。

  • 一個(gè)數(shù)組中全是model對(duì)象,大概如下所示
@interface StudentModel : NSObject

//學(xué)生名字
@property (nonatomic) NSString *name;

//學(xué)生年齡
@property (nonatomic) int age;

@end

篩選出年齡大于20歲的學(xué)生, 我們先創(chuàng)建一點(diǎn)兒數(shù)據(jù)(正常這些數(shù)據(jù)都是網(wǎng)絡(luò)請(qǐng)求所得的),如下

StudentModel *stuOne = [[StudentModel alloc] init];
stuOne.name = @"李明";
stuOne.age = 17;
      
StudentModel *stuTwo = [[StudentModel alloc] init];
stuTwo.name = @"小華";
stuTwo.age = 19;
      
StudentModel *stuTree = [[StudentModel alloc] init];
stuTree.name = @"小李";
stuTree.age = 22;

篩選

NSArray *arr = @[stuOne, stuTwo, stuTree];

//提供篩選條件獲取NSPredicate篩選器
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age > 20"];
    
//按照條件過濾出想要的結(jié)果放到resultArr
NSArray *resultArr = [array filteredArrayUsingPredicate:predicate];

原理和上一個(gè)例子類似。舉一反三

篩選年齡是不是22的學(xué)生: age != 22 。
等等,自行探索吧。

  • 篩選出兩個(gè)數(shù)組的差集
NSArray *oArr = @[@"huahua"];
NSArray *tArr = @[@"xiaoming", @"xiaohong", @"huahua"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)", oArr];
NSArray *resultArr = [tArr filteredArrayUsingPredicate:predicate];

在這個(gè)例子中 篩選條件理解為:tArr 在 oArr 不存在的元素。SELF 指的是tArr。
類似IN NOT 這樣的字符串有下面幾種固定的。
AND、OR、IN、NOT、ALL、ANY、SOME、NONE、LIKE、CASEINSENSITIVE、CI、MATCHES、CONTAINS、BEGINSWITH、ENDSWITH、BETWEEN、NULL、NIL、SELF、TRUE、YES、FALSE、NO、FIRST、LAST、SIZE、ANYKEY、SUBQUERY、CAST、TRUEPREDICATE、FALSEPREDICATE,
所表達(dá)的含義和字母意識(shí)都差不多。

  • 查找出姓李的學(xué)生,使用上面例子的數(shù)據(jù)
NSArray *arr = @[stuOne, stuTwo, stuTree];

//提供篩選條件獲取NSPredicate篩選器
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name LIKE '李*'"];
    
//按照條件過濾出想要的結(jié)果放到resultArr
NSArray *resultArr = [array filteredArrayUsingPredicate:predicate];

如果'李*'為變量,該變量屬于stuModel

NSArray *arr = @[stuOne, stuTwo, stuTree];

//提供篩選條件獲取NSPredicate篩選器
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name LIKE %@", stuModel.name ];
    
//按照條件過濾出想要的結(jié)果放到resultArr
NSArray *resultArr = [array filteredArrayUsingPredicate:predicate];

本例的篩選條件涉及到LIKE,模糊查詢,類似sql語句的中的like。

>'李*' : 姓李的。
>'*李*': 包含李字的。
'*李' : 李字結(jié)尾的。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 設(shè)計(jì)模式是什么? 你知道哪些設(shè)計(jì)模式,并簡要敘述? 設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn),就是用比較成熟的邏輯去處理某一種類型的...
    Jt_Self閱讀 836評(píng)論 0 4
  • 設(shè)計(jì)模式是什么? 你知道哪些設(shè)計(jì)模式,并簡要敘述? 設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn),就是用比較成熟的邏輯去處理某一種類型的...
    如果我們是朋友閱讀 743評(píng)論 0 9
  • 設(shè)計(jì)模式是什么? 你知道哪些設(shè)計(jì)模式,并簡要敘述?設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn),就是用比較成熟的邏輯去處理某一種類型的事...
    irenb閱讀 5,382評(píng)論 1 21
  • 設(shè)計(jì)模式是什么? 你知道哪些設(shè)計(jì)模式,并簡要敘述? 設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn),就是用比較成熟的邏輯去處理某一種類型的...
    small_Sun閱讀 486評(píng)論 0 4
  • 轉(zhuǎn)自:http://www.cnblogs.com/allencelee/p/7169071.html設(shè)計(jì)模式是什...
    RichieQ閱讀 599評(píng)論 0 4

友情鏈接更多精彩內(nèi)容