我有一个数据结构(在plist中),看起来像这样:
我这里有NSArray
NSDictionary
。每个NSDictionary
都有两个键:
Title
Link (recursive)
这形成了一个树状结构,具有可变长度的分支,即一些分支可以在0级死亡,有些分支可以达到3级或更多。
我在UITableView
中展示了这个结构(在UINavigationController
的帮助下)。这很容易。
注意:点击叶节点 (由
NSDictionary
对象表示 Nil 或 Zero 为“Link”),a 事件被触发,即模型窗口 出现了一些信息。
现在,我需要添加搜索支持。
搜索栏将显示在UITabeView
上方(对于0级)。我需要提出一种搜索此树状结构的方法,然后使用UISearchDisplayController
显示结果,然后允许用户也可以导航结果。
怎么样?......我有点陷入困境 并需要一些建议。
搜索必须快速,因为我们在您键入时需要搜索。
P.S。我曾想过将这个数据结构转换为CoreData,它仍然潜藏在我的脑海中。如果您认为在这种情况下可以提供帮助,请告知。
编辑: 这是我目前的解决方案,顺便说一下:
#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;
}
答案 0 :(得分:1)
核心数据将能够非常有效地在数据存储中执行搜索,并且可以有效地将搜索扩展到更高级别。此外,如果对TableView使用NSFetchedResultsController,它几乎肯定会有更高的内存效率 - 最坏的情况是在任何给定时间只加载一个级别数组。最好的情况要好得多,因为它只有faulted个数组中的一些对象。 HTH