4

シンプルなアプリのデバッグに一晩中費やしています。このアプリは、Webから1つの画像(はい、私の生活を楽にすることを目的としています)を取得し、テーブルビューで表示します。私はコアデータを学ぶための練習としてそれを行います。修正する前に、エラーメッセージは次のように表示されます。

2012-09-30 06:16:12.854サムネイル[34862:707] CoreData:エラー:重大なアプリケーションエラー。-controllerDidChangeContent:の呼び出し中に、NSFetchedResultsControllerのデリゲートから例外がキャッチされました。無効な更新:セクションの数が無効です。更新後のテーブルビューに含まれるセクションの数(1)は、更新前のテーブルビューに含まれるセクションの数(0)に、挿入または削除されたセクションの数(0挿入、0)をプラスマイナスする必要があります。削除)。userInfo(null)を使用

基本的には、FRCデリゲートメソッドで問題が発生したと言っています。一方では、セクション番号が0から1に変わります。他方では、「0が挿入され、0が削除されました」。では、セクション番号はどのように増やすことができますか?それは起こらないはずです..したがって、エラー。

FRCセットアップメソッドに追加[self.tableView reloadData]するだけでバグを修正します。この投稿からインスピレーションを得ましたが、よくわかりません。答えは複雑すぎてプロジェクト固有のようです。誰かが追加するreloadDataことでバグを修正できる理由を説明できますか?答えは簡単かもしれませんが、そう願っています。

それが重要な場合、私のアプリの主要なコンポーネント:

  • UIManagedDocumentコアデータスタックを確立するために使用します
  • FlickrAPIから画像をダウンロードするためのヘルパーメソッドを作成します
  • NSManagedObjectサブクラスファイルで、永続ストアからイメージをフェッチしてみてください。まだない場合は、MOCに挿入します。

    - (void)setupFetchedResultsController
    {
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"BigImage" inManagedObjectContext:self.document.managedObjectContext];
        [fetchRequest setEntity:entity];
    
        NSSortDescriptor *imageDescriptor = [[NSSortDescriptor alloc] initWithKey:@"image" ascending:YES];
        NSArray *sortDescriptors = [NSArray arrayWithObject: imageDescriptor];
        [fetchRequest setSortDescriptors:sortDescriptors];
    
        [fetchRequest setFetchBatchSize:20];
    
        // Create fetch results controller
        self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.document.managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
    
        self.fetchedResultsController.delegate = self;
    
        NSError *error;
        if (![self.fetchedResultsController performFetch:&error])
        {
            NSLog(@"Error in performFetch: %@, %@", error, [error userInfo]);
        }
    
        // Critical!! I add this line to fix the bug!
            [self.tableView reloadData];
        }
    
4

1 に答える 1

7

フェッチされた結果コントローラーは、最初のフェッチの管理対象オブジェクトの内容への変更のみを追跡します。これらの変更は、デリゲートメソッドなどを使用してテーブルビューに伝播されdidChangeSectionますdidChangeObject

ただし、最初のフェッチの結果がテーブルビューに送信される自動メカニズムはありません。reloadDataそれがあなたが後に電話しなければならない理由ですperformFetch

ただし、これが自動的に機能するように見える状況があります。UITableViewController呼び出します(テーブルが最初にロードされた場合)reloadDataviewWillAppearしたがって、たとえばでFRCを設定するとviewDidLoadreloadDataで呼び出されviewWillAppear、手動で呼び出す必要はありません。

于 2012-09-30T07:44:23.527 に答える