Ios 搜索NSDictionary的NSArray(包含NSDictionary的NSArray,重复)
我有一个数据结构(在plist中),看起来像这样: 我这里有一个Ios 搜索NSDictionary的NSArray(包含NSDictionary的NSArray,重复),ios,search,tree,nsarray,nsdictionary,Ios,Search,Tree,Nsarray,Nsdictionary,我有一个数据结构(在plist中),看起来像这样: 我这里有一个nsdirectory的NSArray。每个NSDictionary有两个键: Title Link (recursive) 这形成了一个树状结构,具有可变长度的分支,即一些分支可以在级别0处消亡,而一些分支可以大到级别3或更高 我将在UITableView中显示此结构(在UINavigationController的帮助下)。这很容易 注意:单击叶节点时 (由NSDictionary对象表示) 使用Nil或Zero作为“链接”
nsdirectory
的NSArray
。每个NSDictionary
有两个键:
Title
Link (recursive)
这形成了一个树状结构,具有可变长度的分支,即一些分支可以在级别0处消亡,而一些分支可以大到级别3或更高
我将在UITableView
中显示此结构(在UINavigationController
的帮助下)。这很容易
注意:单击叶节点时
(由NSDictionary
对象表示)
使用Nil或Zero作为“链接”),则
触发事件,即模型窗口
显示一些信息
现在,我需要添加搜索支持
搜索栏将出现在UITableView
上方(对于0级)。我需要找到一种方法来搜索这个树状结构,然后使用UISearchDisplayController
显示结果,然后允许用户导航结果
怎么做?。。。这是我有点困的地方
需要一些建议
搜索必须快速,因为我们希望在您键入时进行搜索
p、 我曾想过将这个数据结构转换成CoreData,但它仍然潜伏在我的脑海中。如果您认为它在这种情况下有帮助,请提供建议
编辑: 这是我目前的解决方案,它正在发挥作用(顺便说一句): 核心数据将能够非常高效地在数据存储中执行搜索,并将搜索扩展到更高效的级别。此外,如果您使用TableView,几乎可以肯定它的内存效率会更高—最坏的情况是在任何给定时间只加载一个级别数组。最好的情况要好得多,因为数组中只有几个对象。HTH核心数据将能够非常高效地在数据存储中执行搜索,并将搜索扩展到更高效的级别。此外,如果您使用TableView,几乎可以肯定它的内存效率会更高—最坏的情况是在任何给定时间只加载一个级别数组。最好的情况要好得多,因为数组中只有几个对象。嗯
#pragma mark -
#pragma mark UISearchDisplayController methods
- (void)searchBarResultsListButtonClicked:(UISearchBar *)searchBar {
NSLog(@"%s", __FUNCTION__);
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
NSLog(@"%s", __FUNCTION__);
[self filterCategoriesForSearchText:searchString
scope:[controller.searchBar selectedScopeButtonIndex]];
// Return YES to cause the search result table view to be reloaded.
return YES;
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption {
NSLog(@"%s", __FUNCTION__);
[self filterCategoriesForSearchText:[controller.searchBar text]
scope:[controller.searchBar selectedScopeButtonIndex]];
// Return YES to cause the search result table view to be reloaded.
return YES;
}
#pragma mark UISearchDisplayController helper methods
- (void)filterCategoriesForSearchText:(NSString *)searchText scope:(NSInteger)scope {
self.filteredCategories = [self filterCategoriesInArray:_categories forSearchText:searchText];
NSSortDescriptor *descriptor = [[[NSSortDescriptor alloc] initWithKey:KEY_DICTIONARY_TITLE ascending:YES] autorelease];
[self.filteredCategories sortUsingDescriptors:[NSArray arrayWithObjects:descriptor, nil]];
}
- (NSMutableArray *)filterCategoriesInArray:(NSArray *)array forSearchText:(NSString *)searchText {
NSMutableArray *resultArray = [NSMutableArray array];
NSArray *filteredResults = nil;
// Apply filter to array
// For some weird reason this is not working. Any guesses? [NSPredicate predicateWithFormat:@"%@ CONTAINS[cd] %@", KEY_DICTIONARY_TITLE, searchText];
NSPredicate *filter = [NSPredicate predicateWithFormat:@"Title CONTAINS[cd] %@", searchText];
filteredResults = [array filteredArrayUsingPredicate:filter];
// Store the filtered results (1)
if ((filteredResults != nil) && ([filteredResults count] > 0)) {
[resultArray addObjectsFromArray:filteredResults];
}
// Loop on related records to find the matching results
for (NSDictionary *dictionayObject in array) {
NSArray *innerCategories = [dictionayObject objectForKey:KEY_DICTIONARY_LINK];
if ((innerCategories != nil) && ([innerCategories count] > 0)) {
filteredResults = [self filterCategoriesInArray:innerCategories forSearchText:searchText];
// Store the filtered results (2)
if ((filteredResults != nil) && ([filteredResults count] > 0)) {
[resultArray addObjectsFromArray:filteredResults];
}
}
}
return resultArray;
}