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

时间:2015-06-08 00:19:25

标签: objective-c nsmutablearray filtering nspredicate

我有一个非常简单的NSPredicate,它应该过滤我的自定义对象数组。

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

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

我知道数组中填充了26个自定义类型的对象,其中标题看起来像这样

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

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

我已经把头发拉了半天以上,因为我无法说出错误。

编辑1: 我尝试使用此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] (
)

1 个答案:

答案 0 :(得分:1)

狂野的推测,但我的理论是你在运行过滤器后没有“重置”self.displayedSources。由于您在适当的位置过滤数组,因此错误的击键会永远清除阵列。

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

将过滤后的数组存储在另一个变量中:

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

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

NSLog(@"%@", filtered);