美文网首页
IOS NSPredicate - 加速数据处理

IOS NSPredicate - 加速数据处理

作者: 灰斗儿 | 来源:发表于2016-09-26 17:37 被阅读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。

    >'李*' : 姓李的。
    >'*李*': 包含李字的。
    '*李' : 李字结尾的。
    

    相关文章

      网友评论

          本文标题:IOS NSPredicate - 加速数据处理

          本文链接:https://www.haomeiwen.com/subject/lfpqyttx.html