NSFetchedResultsController

NSFetchedResultsController

我正在尝试过滤UITableView中的对象,该对象通过NSFetchedResultsController从Core Data sqlite获取其数据。在过滤之前,它可以正常工作,但是现在我需要能够点击一个按钮,并使它仅显示其属性之一(BOOL)是YES的对象。让我们称之为isFavourite

我对从哪里开始有点困惑。我了解谓词的概念,因此我构建了该谓词,该谓词应该起作用:

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"isFavourite == 1"];

但是,对于如何将该谓词附加到NSFetchedResultsController,我有些困惑。我已经使用一个单独的提取请求分配并初始化了该请求,该请求仅返回了该实体的所有对象(并且运行良好)。如果已经初始化,是否可以更改其获取请求?如果是这样,我该怎么做,然后如何使其重新运行查询。然后,我是否需要使用UITableView或类似名称手动更新reloadData。然后,当我想关闭此过滤器并返回查看所有结果时该怎么办?

我在这里阅读了很多现有问题,但大多数似乎与搜索栏有关,这使答案变得更加复杂。我也阅读了Apple文档,但是倾向于以一种非常隐秘的方式找到它。我的代码在下面,我只是通过filterFavourite方法的中途,这就是我在寻求帮助和说明的地方。
- (NSFetchedResultsController *) fetchedResultsController
{
    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName: @"Quote" inManagedObjectContext: [[CoreDataController sharedCoreDataController] managedObjectContext]];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey: @"quoteID" ascending: YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];

    [fetchRequest setFetchBatchSize: 50];

    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest: fetchRequest managedObjectContext: [[FQCoreDataController sharedCoreDataController] managedObjectContext] sectionNameKeyPath: nil cacheName: nil];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;

    return _fetchedResultsController;
}

- (IBAction) filterFavourite: (id) sender
{
    if (isDisplayingFavourite) {
        // Switch to showing all..
        NSPredicate *predicate = [NSPredicate predicateWithFormat: @"isFavourite == 1"];

        isDisplayingFavourite = NO;
    } else {
        // Switch to showing favourites only..

        isDisplayingFavourite = YES;
    }

}

编辑:在此代码中永远不会调用委托方法“controllerDidChangeContent”。我也不知道为什么。极其令人困惑的是,Core Data就像一堵砖墙。实际上,从未调用过四种委托方法。

最佳答案

您无需将谓词附加到NSFetchedResultsController上,而是将其附加到NSFetchRequest上。它有一个叫做setPredicate:的方法,它的功能完全符合其名称的含义。

您可以通过更新fetchRequest属性并再次调用performFetch:来修改获取请求。您还可以取消fetchedResultsController ivar,并使上面的代码足够灵活以添加任何有用的谓词。下次调用fetchedResultsController方法时,它将使用当前谓词为您创建一个新实例。这样可以用一种方法合并所有NSFetchedResultsController代码。它在CPU使用率上可能会稍微贵一些,但也可能更易于维护。

关于ios - 从NSFetchedResultsController过滤基于NSPredicate的UITableView,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15071364/

10-12 03:30