2

通常のボイラープレート コードを使用して Core Data アプリをセットアップし、RootViewController はこれを呼び出して FRC を初期化します。

- (NSFetchedResultsController *)fetchedResultsController 
{
    if (__fetchedResultsController != nil) 
    {
        return __fetchedResultsController;
    }
    // configure the fetchRequest, sectionKey and cacheName
    __fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest: fetchRequest 
                                                                    managedObjectContext: self.managedObjectContext 
                                                                      sectionNameKeyPath: sectionKey 
                                                                               cacheName: cacheName];
    return __fetchedResultsController;
}

私が見たすべてのサンプルコードはこれを行います。しかし、私は大規模なデータ セットを持っており、15,000 を超えるエントリがあるため、iPhone 4S でアプリを起動するのに約 5 秒かかります。これは、キャッシュが有効になっており (キャッシュがないと、11 秒かかります)、インデックス付きの属性を使用しています。

UIActivityIndicatorViewだから私はアプリがこれをロードするのを待っていることを表示できるようにしたい. バックグラウンド スレッドでコア データ オブジェクトをロードし、それらをメイン スレッドにマージする一般的な方法は知っていますが、バックグラウンド スレッドで FRC を初期化して、すべてのオブジェクトがバックグラウンドでロードおよびセクション化されるようにするにはどうすればよいでしょうか?

バックグラウンド スレッドですべてのオブジェクトを読み込んでカスタム ディクショナリに分割し、それを使用してデータを表示できることはわかっていますが、標準の FRC 呼び出しとデリゲートを使用したいと思います。

ありがとう。

4

2 に答える 2

3

バックグラウンドでを使用することの意味がよくわかりませんNSFetchedResultsControllerが、私の経験に基づいて、次のようにフェッチ リクエストのバッチ サイズを設定するだけで済みます。

[fetchRequest setFetchBatchSize:20];

このように、起動時に最初の 20 個の要素がロードされ、次の 20 個をスクロールすると、というように続きます。さらに、 でフェッチするプロパティを選択することもできます- (void)setPropertiesToFetch:(NSArray *)values

もう 1 つの方法は、バックグラウンドでオブジェクトのフェッチを開始する (バックグラウンド) タスクを用意することです。バックグラウンドでフェッチすると、オブジェクトは何らかの方法でキャッシュされるため (よくわかりません)、メイン スレッドからより迅速にアクセスできると思います。

それが役に立てば幸い。

于 2012-06-06T07:58:36.290 に答える
1

私はそれを理解したと思います...バックグラウンドスレッドでFRCを作成し、メインスレッドでフェッチを行うことができます:

- (NSFetchedResultsController *)fetchedResultsController 
{
    if (__fetchedResultsController != nil) 
    {
        return __fetchedResultsController;
    }

    // create something to pass back to the first time FRC is initialized without fetching
    __block NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
    aFetchedResultsController.delegate = self;
    [self.list_spinner startAnimating];

    dispatch_async(self.filterMainQueue, ^{

           NSFetchedResultsController *newFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest: fetchRequest 
                                                                                                         managedObjectContext: self.managedObjectContext 
                                                                                                           sectionNameKeyPath: sectionKey 
                                                                                                                    cacheName: cacheName];
           dispatch_async(dispatch_get_main_queue(), ^{ 
               // stop the spinner here
               [self.list_spinner stopAnimating];

               NSError *error = nil;
               if (![newFetchedResultsController performFetch:&error]) 
               {
                   NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
                   [SimpleListAppDelegate showCoreDataError: @"SimpleListViewController - FRC"];
               }
               __fetchedResultsController = nil;
               newFetchedResultsController.delegate = self;
               __fetchedResultsController = newFetchedResultsController;
               [self.tableView reloadData];
           });
         });

    return aFetchedResultsController;
}
于 2012-06-07T00:30:56.760 に答える