NSPredicate with block - 它是如何工作的

时间:2014-09-29 14:55:10

标签: ios objective-c arrays

我的应用程序中有一个搜索机制,到目前为止,NSPredicate的对象用于过滤对象。

我很困惑,因为我的程序运行时发生了神奇的事情。在我的程序中有一个带有名称的数组和另一个带有声明为属性的过滤名称的可变数组。

@property (strong, nonatomic) NSArray *names;
@property (strong, nonatomic) NSMutableArray *filteredNames;

在加载视图时,我使用名称初始化数组。

self.names = @[
               @"Aeron",
               @"Brandon",
               @"Chris",
               @"David",
               @"Elvis",
               @"Francisco",
               @"George",
               @"Oliver",
               @"Lary",
               @"Neythan",
               @"Marcus",
               @"Phil"
               ];

然后我设置一个表视图及其内容,安装搜索机制(使用iOS 8的一个,即UISearchController)。在这里,我们实施UISearchResultsUpdating协议,我的updateSearchResultsForSearchController:如下所示。

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController {
    NSString *input = searchController.searchBar.text;
    if (input.length > 0) {
        [self.filteredNames removeAllObjects];

        NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
            NSLog(@"Got [%@] string.", evaluatedObject);
            NSRange range = [evaluatedObject rangeOfString:input options:NSCaseInsensitiveSearch];
            return range.location != NSNotFound;
        }];

        NSArray *matches = [self.names filteredArrayUsingPredicate:predicate];
        [self.filteredNames addObjectsFromArray:matches];

        [((UITableViewController *)self.searchController.searchResultsController).tableView reloadData];
    }
}

所以它完美无缺。但是我想知道,为什么我会在块内部使用名称来获取我的数组的迭代?我知道块是好的,因为它们的规范是从过去的所有变量和特定值的堆栈中保存它们的帧,因此它们最近可以执行。但是为什么块会迭代这个特定的数组呢?我试图声明一个新的并初始化它(因为我认为它占用了所有集合及其值),但它没有用。

提前谢谢!

1 个答案:

答案 0 :(得分:2)

要过滤数组,您必须遍历每个元素并针对谓词块对其进行测试。我相信您正在经历的行为。