NSArray filterArrayUsingPredicate永远不会返回/阻止执行

时间:2015-06-05 22:33:26

标签: ios objective-c arrays nsarray nspredicate

我尝试根据这些对象的<>属性过滤自定义对象数组。

为了确保一切正常,我只是使用了它,它应该与数组中的1个元素匹配:

name

这应记录

NSLog(@"Length before %lu", (unsigned long) [self.mutableAvailableSources count]);

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(name == CNN)"];
[self.mutableAvailableSources filterUsingPredicate:predicate];

NSLog(@"Length after %lu", (unsigned long) [self.mutableAvailableSources count]);

但是,它只记录

Length before 9
Length after 1

然后它停止执行。没有超过过滤数组的行被执行。我尝试在第二个Length before 9 语句中放置断点,但它永远不会到达。但是,如果我在过滤数组的行上放置一个断点,它会停止,我可以确认数组和谓词都存在。

这里发生了什么?

顺便说一下,这是在异步块中发生的,因此应用程序永远不会冻结。但是块中的其余代码都没有执行。

1 个答案:

答案 0 :(得分:1)

更改为:

 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == 'CNN'"];

在谓词中,你必须使用查询语言,在这种情况下是一个字符串文字:在查询语言中有两个选项:'stringLitareal'或“stringLiteral”但这第二个不起作用因为“用于Objective-C,你需要scape“,那就是:名字== \”CNN \“。你可以测试一下,是一样的:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == \"CNN\""];

更多信息:https://developers.google.com/chart/interactive/docs/querylanguage#literals

圆括号不是问题(查询语言)。这也有效:@“(name =='CNN')”