1

データ・モデル

ユーザーが一連の写真をフィルタリングできるようにするインターフェイスを構築しています。データモデルは上記です。結果が0になるコントロールを無効にしたいと思います。

これを達成するために、ユーザーが独自の変更を行うたびに、オフ/選択されていないすべてのコントロールに対して新しいフェッチ要求を実行しています。コントロールが表すデータを NSCompoungPredicate に追加し、結果を取得したら削除します。結果のカウントが 0 の場合、そのコントロールを無効にします。

私はこれをすべてメインスレッドで行っているため、場合によってはアプリに少し遅れがあります。より少ないオーバーヘッドでこのタイプのフィルタリングを行うより良い方法はありますか? これらのフィルタ フェッチを独自のスレッドで実行する必要がありますか? 私はCoreDataでそれをしたことがなく、読んだことをワームします。そのために別のコンテキストが必要であり、そのためのコードを設定する方法がわかりません。

4

1 に答える 1

1

少しのコードが役立ちます。それとは別に、ここにいくつかの提案があります。

まず、フェッチ リクエストで 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 を使用することもできますが、これは問題です。

于 2012-04-25T17:58:03.300 に答える