如何使用NSFetchedResultsController和UISearchDisplayController

我一直在使用核心数据创建一个iPhone应用程序。

首先,使用NSFetchedResultsController和UISearchDisplayController来获取结果是否合理? 你会推荐别的吗?

我一直在尝试将NSFetchedResultController和UISearchDisplayController结合起来。 我一直在考虑在(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption中设置一个NSPredicate (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption方法到UIViewController的(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption 。 但是这不太好。

那么,你有没有想法如何为我的问题实施解决方案? 感谢您发布答案或指向优秀教程的链接。

编辑

这是我的代码。 UISearchDisplayDelegate方法调用方法(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope ,它应该在NSFetchedResultController中设置谓词。 我还添加了NSFetchedResultController的代码。

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterContentForSearchText:searchString scope:
     [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];

    // Return YES to cause the search result table view to be reloaded.
    return YES;
}


- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
{
    [self filterContentForSearchText:[self.searchDisplayController.searchBar text] scope:
     [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]];

    // Return YES to cause the search result table view to be reloaded.
    return YES;
}


- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSString *query = self.searchDisplayController.searchBar.text;
    if (query && query.length) {
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Name contains[cd] %@", query];
        [fetchedResultsController.fetchRequest setPredicate:predicate];
    }

    NSError *error = nil;
    if (![[self fetchedResultsController] performFetch:&error]) {
        // Handle error
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }  

}


- (NSFetchedResultsController *)fetchedResultsController {

    if (fetchedResultsController != nil) {
        return fetchedResultsController;
    }

    /*
     Set up the fetched results controller.
    */
    // Create the fetch request for the entity.
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    // Edit the entity name as appropriate.
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];

    // Set the batch size to a suitable number.
    [fetchRequest setFetchBatchSize:20];

    // Edit the sort key as appropriate.
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

    [fetchRequest setSortDescriptors:sortDescriptors];

    // Edit the section name key path and cache name if appropriate.
    // nil for section name key path means "no sections".
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;

    [aFetchedResultsController release];
    [fetchRequest release];
    [sortDescriptor release];
    [sortDescriptors release];

    return fetchedResultsController;
} 

看着你的代码,它就在那里。 我遇到了使用此方法更改搜索的问题。 修复:清除缓存!

假设您按如下方式启动了您的提取结果控制器。 请注意cacheName属性。

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:[self fetchRequest] managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"UserSearch"];

在您更改谓词时,只需添加:

 [NSFetchedResultsController deleteCacheWithName:@"UserSearch"];

就像魔术一样,它会很好地工作。

您还需要监视搜索显示控制器何时结束搜索并擦除谓词。

尽管此线程看起来死了,但我在谷歌上找到了它,所以也许有人会使用它。 :)


根据文档,您要么使用谓词将结果过滤到数组中,要么重新初始化fetchedResultsController。

重要提示:在初始化控制器之后,您不能修改获取请求。 例如,您不得更改谓词或排序顺序。

- NSFetchedResultsController

(我会评论闲置的答案,但我没有业力。)


这听起来像你只是对获取和显示对象感兴趣。 在这种情况下,您不使用搜索显示控制器。 搜索显示控制器与搜索栏一起使用,以帮助允许用户输入文本搜索您的内容。

通常情况下,您使用获取的结果控制器来帮助实现表视图数据源和委托方法。 此外,您还为您的抓取结果控制器创建并使用抓取请求。 这是所有的样板(参见Apple在您创建一个新项目时使用“使用核心数据进行存储”选项提供的模板代码)。

它位于获取请求中,您可以创建并指定一个谓词。 这将允许您过滤表格显示的对象。 例如:

// only fetch objects with myAttribute set to someValue
NSPredicate *pred = [NSPredicate predicateWithFormat:@"myAttribute == %@",someValue];
[fetchRequest setPredicate:pred];
链接地址: http://www.djcxy.com/p/36127.html

上一篇: How to use NSFetchedResultsController and UISearchDisplayController

下一篇: Custom sorting with NSFetchedResultController (subclassing NSSortDescriptor)