搜索NSDictionary的NSDrray(其中包含NSDictionary的NSArray,重复)

时间:2011-06-22 07:16:22

标签: ios search tree nsarray nsdictionary

我有一个数据结构(在plist中),看起来像这样:

enter image description here

我这里有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;
}

1 个答案:

答案 0 :(得分:1)

核心数据能够非常有效地在数据存储中执行搜索,并且可以有效地将搜索扩展到更高级别。此外,如果对TableView使用NSFetchedResultsController,它几​​乎肯定会有更高的内存效率 - 最坏的情况是在任何给定时间只加载一个级别数组。最好的情况要好得多,因为它只有faulted个数组中的一些对象。 HTH