IOS NSPredicate - 加速数据处理
2016-09-26 本文已影响75人
灰斗儿
序言
NSPredicate 学名叫谓词逻辑。提供一个筛选条件给它,它就可以在最短的时间内筛选出你想要的。简直快到没朋友,甩for循环几条街。
几种常见的处理数据处理
- 获取字符串数组中长度大于3的元素
//字符串数组
NSArray *array = @[@"mally", @"lisa", @"shally"];
//提供筛选条件获取NSPredicate筛选器
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"length <= 4"];
//按照条件过滤出想要的结果放到resultArr
NSArray *resultArr = [array filteredArrayUsingPredicate:predicate];
length 是哪里来的?
数组中所有元素都是字符串,也就是NSString,而NSString 具有length这个属性。如果有其他需求,可以查看NSString 的属性列表,根据需求写筛选条件。
执行过程是怎样的?
筛选器(NSPredicate)会获取到数组中的每一个元素(这里是字符串),执行:self.length<=4 这个判断条件,self是当前执行判断的某个元素(这里是某个字符串)。将符合条件的过滤到一个新的数组。全部筛选完毕后,返回这个新的数组。
- 一个数组中全是model对象,大概如下所示
@interface StudentModel : NSObject
//学生名字
@property (nonatomic) NSString *name;
//学生年龄
@property (nonatomic) int age;
@end
筛选出年龄大于20岁的学生, 我们先创建一点儿数据(正常这些数据都是网络请求所得的),如下
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"];
//按照条件过滤出想要的结果放到resultArr
NSArray *resultArr = [array filteredArrayUsingPredicate:predicate];
原理和上一个例子类似。举一反三
筛选年龄是不是22的学生: age != 22 。
等等,自行探索吧。
- 筛选出两个数组的差集
NSArray *oArr = @[@"huahua"];
NSArray *tArr = @[@"xiaoming", @"xiaohong", @"huahua"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)", oArr];
NSArray *resultArr = [tArr filteredArrayUsingPredicate:predicate];
在这个例子中 筛选条件理解为: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,
所表达的含义和字母意识都差不多。
- 查找出姓李的学生,使用上面例子的数据
NSArray *arr = @[stuOne, stuTwo, stuTree];
//提供筛选条件获取NSPredicate筛选器
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name LIKE '李*'"];
//按照条件过滤出想要的结果放到resultArr
NSArray *resultArr = [array filteredArrayUsingPredicate:predicate];
如果'李*'为变量,该变量属于stuModel
NSArray *arr = @[stuOne, stuTwo, stuTree];
//提供筛选条件获取NSPredicate筛选器
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name LIKE %@", stuModel.name ];
//按照条件过滤出想要的结果放到resultArr
NSArray *resultArr = [array filteredArrayUsingPredicate:predicate];
本例的筛选条件涉及到LIKE,模糊查询,类似sql语句的中的like。
>'李*' : 姓李的。
>'*李*': 包含李字的。
'*李' : 李字结尾的。