为什么这个简单的 NSPredicate 不过滤我的数组

Why doesn't this simple NSPredicate filter my array

我有一个非常简单的 NSPredicate,用于过滤我的自定义数组 objects。

NSLog(@"%@", self.displayedSources);
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", searchText];
[self.displayedSources filterUsingPredicate:predicate];
NSLog(@"%@", self.displayedSources);

然而,这给我留下了 0 个结果(即使 empty searchText)。

我知道数组填充了 26 个 objects 自定义类型,其中 header 看起来像这样

@interface NewsSourceObject : NSObject <NSCoding>
@property (nonatomic, copy,   readonly) NSString *objectId;
@property (nonatomic, copy,   readonly) NSString *name;
...
@end

我知道代码正在执行,因为我在应用谓词 (26 - 0) 之前和之后添加了记录数组长度的打印语句。

我已经为此烦恼了半天多了,因为我不知道哪里出了问题。

编辑 1: 我尝试使用 objects:

description 方法在应用谓词之前和之后记录数组的内容(参见顶部代码块)
- (NSString *)description {
  return [NSString stringWithFormat:@"%@", self.name];
}

这就是我得到的:

2015-06-08 02:57:28.521 Newsloop[8554:1578121] (
  "ABC News",
  "BBC News",
  "Bleacher Report",
  "Business Insider",
  "BuzzFeed News",
  CNN,
  "Daily Mail Online",
  ...
)
2015-06-08 02:57:28.522 Newsloop[8554:1578121] (
)

胡思乱想,但我的理论是 "reset" self.displayedSources 在 运行 过滤器之后。由于您就地过滤数组,一次错误的击键将永远清除数组。

您可能 运行 那部分代码 searchText 仍然包含空字符串。这基本上从数组中删除了所有对象。每个连续的击键 运行s 是对空数组的一个过滤器。

改为将过滤后的数组存储在不同的变量中:

NSLog(@"%@", self.displayedSources);
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", searchText];

NSArray *filtered = [self.displayedSources filteredArrayUsingPredicate:predicate];

NSLog(@"%@", filtered);