iOS NSPredicate的学习讲解

作者: 久林的技术随笔 | 来源:发表于2015-11-08 13:45 被阅读13674次

            iOS Predicate 即谓词逻辑。和数据库的SQL语句具有相似性,都是从数据堆中根据条件进行筛选。

    1.使用场景:        

           (1)NSPredicate给我留下最深印象的是两个数组求交集的一个需求,如果按照一般写法,需要2个遍历,但NSArray提供了一个filterUsingPredicate的方法,用了NSPredicate,就可以不用遍历!

           (2)在存储自定义对象的数组中,可以根据条件查询数组中满足条件的对象。

    2.首先熟悉Predicate:

    NSArray *array1 = [NSArray arrayWithObjects:@1,@2,@3,@5,@5,@6,@7, nil];

    NSArray *array2 = [NSArray arrayWithObjects:@4,@5, nil];

    // 表示筛选array1在array2中的元素!YES!其中SELF指向filteredArrayUsingPredicate的调用者。

    /*测试方案:

    NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"SELF  in %@",array2];

    NSArray *temp1 = [array1 filteredArrayUsingPredicate:predicate1];

    //表示array1在array2中元素

    结果:

    2015-11-08 10:55:19.879 NSPredicateDemo[11595:166012] obj ==5

    2015-11-08 10:55:19.879 NSPredicateDemo[11595:166012] obj ==5

    NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"SELF  in %@",array1];

    NSArray *temp1 = [array2 filteredArrayUsingPredicate:predicate1];

    结果:

    2015-11-08 10:55:19.879 NSPredicateDemo[11595:166012] obj ==5

    */

    NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"SELF  in %@",array2];

    NSArray *temp1 = [array1 filteredArrayUsingPredicate:predicate1];

    [temp1 enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

    NSLog(@"temp1 = %@",obj);

    }];

    /*

    2015-11-08 10:55:19.879 NSPredicateDemo[11595:166012] obj ==5

    2015-11-08 10:55:19.879 NSPredicateDemo[11595:166012] obj ==5

    */

    3.基本语法

    (1)比较运算符>,<,==,>=,<=,!=

    可用于数值及字符串

    (2)范围运算符:IN、BETWEEN

    例:@"number BETWEEN {1,5}"

    @"address IN {'shanghai','beijing'}"

    (3)字符串本身:SELF

    例:@“SELF == ‘APPLE’"

    (4)字符串相关:BEGINSWITH、ENDSWITH、CONTAINS

    例:@"name CONTAIN[cd] 'ang'"  //包含某个字符串

    @"name BEGINSWITH[c] 'sh'"    //以某个字符串开头

    @"name ENDSWITH[d] 'ang'"      //以某个字符串结束

    注:[c]不区分大小写[d]不区分发音符号即没有重音符号[cd]既不区分大小写,也不区分发音符号。

    (5)通配符:LIKE

    例:@"name LIKE[cd] '*er*'"    //*代表通配符,Like也接受[cd].

    @"name LIKE[cd] '???er*'"

    具体代码见git:https://github.com/jiulin/NSPredicateDemo

    期待和你一起学习!

    QQ:983202699

    相关文章

      网友评论

      • RobinZhao:我想问一下两个数组里面都存的是模型model,我想通过model.name筛选出arry1中包含arry2的内容,Format怎么写?
      • xt723:慎用啊,亲身体验,执行性能很成问题啊
        iOS_修心:没有找到具体原理,哪方面造成,性能开销大
      • dbc0210320ac:你好啊。我是小白来的 前面的两个例子因为代码有输出有注释我都看明白了,后面的如果有注释有输出结果那就更加感谢你了,后面的我看不懂 ,猜也不知道对不对。
      • GiantAxe77:代码重写整理下啊,看不懂都
      • 蔡胜波:很有用,感谢分享 :blush:
      • a706aa61f4d8:知道的太晚了
      • joymake:不错
      • 6cb1acf6fac8:谢谢分享
      • Dariel:代码整理下啊,看着好晕
      • xxttw:好好好
      • dd25f9257b81:谢谢分享啊
      • 吃蘑菇De大灰狼:like后面可以接自定义字符吗? @“SELF like '*%@*', str”;貌似搜不到str.
        潘烨:@海棠花开 上面那个我试了就是搜不到。找不出原因
        横穿撒哈拉的骆驼:@MichaelMao 可以吧 刚才测试了一下, 可以搜到
        NSString *formateStr = [NSString stringWithFormat:@"SELF.firstStr like '*objct%@*'",@"1"];
      • mark666:用markdown语法来写,将代码写在
        ```
        ```
        这个里面
        久林的技术随笔:@mark666 好的
      • LJ的ios开发:学习了
        久林的技术随笔:@LJ的ios开发 N Sredicate 尤其是在处理存储对象的数组很方便。

      本文标题:iOS NSPredicate的学习讲解

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