ios - NSArray filterArrayUsingPredicate 从不返回/阻塞执行

标签 ios objective-c arrays nsarray nspredicate

我正在尝试根据这些对象的 name 属性过滤一组自定义对象。

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

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

然后它停止执行。过滤数组后的任何内容都不会被执行。我尝试在第二个 NSLog(..); 语句上放置一个断点,但它永远不会到达。但是,如果我在过滤数组的行上放置一个断点,它将停止并且我可以确认数组和谓词都存在。

这是怎么回事?

顺便说一句,这是在异步 block 中发生的,因此应用程序永远不会卡住。但是 block 中的其余代码不会执行。

最佳答案

更改为:

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

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

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

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

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

关于ios - NSArray filterArrayUsingPredicate 从不返回/阻塞执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30676795/

相关文章:

java - java中删除数组中的元素

objective-c - 在 xcode 中从 UIAccelerometer 计算 G 值

ruby - 如何在给定数组中的某个元素的情况下找到下一个元素

ios - 即使用户删除了 Firebase,它也会存储值(value)

ios - swift 。正确初始化 UITableViewCell 层次结构

objective-c - 如何使所有 Core Data 对象继承 self 的类而不是 NSManagedObject?

ios - 当 iphone/ipad 存储已满时将文件保存到 tmp 目录

c++ - 将char数组快速拆分成 block c++

ios - UITableView didselectrowatindexpath 没有被调用

ios - 在 Scene Kit View 中创建转换小部件