2014-09-29 56 views
0

我在我的应用程序中有一个搜索机制,因此使用NSPredicate的对象来过滤对象。NSPredicate with block - 它是如何工作的

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

@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

对不起,我不知道我理解你的问题。 “为什么块重复这个特定的数组?”你的意思是'self.names'数组?这是因为你正在运行它的过滤功能。当你试图“初始化一个新的”,然后你说它不起作用。你用什么代码来做到这一点,以及**具体是什么**都不起作用?即它做了什么等等......“它不起作用”是对可想象的问题的最不有用的分析。 – Fogmeister 2014-09-29 15:10:56

+0

谢谢!我需要一双新的眼睛! :-D – Majotron 2014-09-29 15:23:50

回答

2

要过滤数组,您必须迭代每个元素并对谓词块进行测试。我相信你正在经历的行为是有意的。

+0

是的,我认为我发送了一封邮件,并想知道数据的来源。 :-D – Majotron 2014-09-29 15:25:43