1

数据模型

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

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

我在主线程上做这一切,所以在某些情况下,应用程序有一点延迟。有没有更好的方法来以更少的开销进行这种类型的过滤?我应该在他们自己的线程上运行这些过滤器获取吗?我从来没有用 CoreData 和蠕虫做过这件事,我读过我需要一个单独的上下文,我不知道如何去设置代码。

4

1 回答 1

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;
    });
}];

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

于 2012-04-25T17:58:03.300 回答