使用核心数据进行快速零结果过滤

时间:2012-04-25 16:34:16

标签: ios core-data nspredicate nsfetchrequest

Data Model

我正在构建一个界面,允许用户过滤一组照片。数据模型如上。我想禁用任何会导致0结果的控件。

为了实现这一点,我每次用户进行自己的更改时,都会为每个关闭/未选中的控件运行新的获取请求。我将控件所代表的数据添加到我的NSCompoungPredicate中,然后在获得结果后将其删除。如果结果的计数为0,则禁用该控制。

我在主线程上执行此操作,因此在某些情况下应用程序中存在一些延迟。有没有更好的方法来进行这种类型的过滤,而且开销更少?我应该在自己的线程上运行这些过滤器提取吗?我从来没有用CoreData和蠕虫做过我已经读过的内容我需要一个单独的上下文,我不知道如何为此设置代码。

1 个答案:

答案 0 :(得分:1)

一些代码会有所帮助。除此之外,这里有一些建议。

首先,在你的获取请求中,使用countForFetchRequest:error:因为它只是查询数据库,并返回计数而不是对象信息。

其次,如果您不想使用线程,并且搜索仍然太慢,您可以在应用启动时执行初始查询。然后,这将启用/禁用各种控件。

您可以简单地捕获告知数据更改时间的上下文通知,并相应地更新该信息。然后,您根本不需要进行任何查询。只需初始化,并在数据库中添加/删除对象时更新状态。

如果你想使用线程,那就不是那么困难。

听起来你想要的只是一个运行查询的线程。你设置了一个MOC ......

NSManagedObjectContext *checkerMoc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
checkerMoc.persistentStoreCoordinator = MyCurrentMoc.persistentStoreCoordinator;

现在,每当你想检查数据库......

[checkerMoc performBlock:^{
    NSFetchRequest *fetchRequest = ...
    // Do your fetch request... this block of code is running in the other thread
    [checkerMoc fetch...];
    // When the fetch request is done, do whatever you want in your UI...
    dispatch_async(dispatch_get_main_queue(), ^{
        // Now this code is running in the main thread... access your UI
        self.myControl.enabled = fetchResultCount > 0;
    });
}];

注意,您使用的是相同的持久性存储协调器,因此如果主线程尝试访问数据库,它将堆叠在此请求之后。你也可以使用一个单独的persistentStoreCoordinator for checkerMoc这是一个问题。