少しのコードが役立ちます。それとは別に、ここにいくつかの提案があります。
まず、フェッチ リクエストで countForFetchRequest:error: を使用します。これは、データベースに対してクエリを実行し、オブジェクト情報の代わりにカウントを返すためです。
第 2 に、スレッドを使用したくない場合でも検索が遅すぎる場合は、アプリの起動時に最初のクエリを実行できます。これにより、さまざまなコントロールが有効/無効になります。
データがいつ変更されたかを知らせるコンテキスト通知を簡単にキャッチし、それに応じてその情報を更新できます。その後、クエリを実行する必要はまったくありません。オブジェクトがデータベースに追加/削除されると、初期化してステータスを更新するだけです。
スレッドを使用したい場合、それはそれほど難しいことではありません。
クエリを実行しているだけのスレッドだけが必要なようです。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 を使用することもできますが、これは問題です。