一些代码会有所帮助。除此之外,这里有一些建议。
首先,在您的获取请求上,使用 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,这是一个问题。