1

バックグラウンドスレッドで更新される とNSFetchedResultsController組み合わせてを使用しています。UIManagedDocument

このチュートリアルで説明されているとおりに NSFetchedResultsController を設定しました: How To Use NSFetchedResultsController

ビューコントローラーのデリゲート_fetchedResultsController.delegate = selfとプロトコルを に設定しましたNSFetchedResultsControllerDelegate

私のコードは、起動後にデータをロードすると正常に動作します。ただし、バックグラウンド スレッドでデータを処理して保存するたびにNSFetchedResultsController 、TableView は更新されません。特に、NSFetchedResultsController のデリゲート メソッド-controllerWillChangeContent:controllerなどが呼び出されることはありません。

SQLite データベースにデータが正しく含まれていることを再確認しました。これは、View Controllerでデータを処理して保存する方法です。

[backgroundContext performBlock:^{
        [company parseAttributesFrom:xmlStr inManagedObjectContext:backgroundContext]; //self.managedDocument.managedObjectContext

        NSError *error = nil;
        [backgroundContext save:&error];
         if (error) NSLog(@"error: %@",error.localizedDescription);
        [self.managedDocument.managedObjectContext performBlock:^{
            NSError *error = nil;
            [self.managedDocument.managedObjectContext save:&error];
            if (error) NSLog(@"error: %@",error.localizedDescription);
        }];
        [self.managedDocument saveToURL:self.managedDocument.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];
        [self.managedDocument updateChangeCount:UIDocumentChangeDone];
    }];

基になるデータが変更されたときに、NSFetchedResultsController が TableView を自動的に更新するようにするにはどうすればよいですか?

ご協力ありがとうございました!

4

2 に答える 2

2

その理由は managedObjectContext にあると思います。バックグラウンドで変更を行いNSFetchedResultsController、メインのものから取得します。したがって、コンテキストの変更のオブザーバーを追加して、変更をその 1 つのコンテキストにマージする必要があります。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextChanged:) name:NSManagedObjectContextDidSaveNotification object:nil];

これは、Marcus Zarra による素晴らしいチュートリアルです - The Guru of Core Data) お役に立てば幸いです。 http://www.cimgf.com/2011/08/22/importing-and-displaying-large-data-sets-in-core-data/

于 2012-06-25T16:12:38.850 に答える
1

UIManagedDocument を使用する場合は、バックグラウンド コンテキストをメイン コンテキストの子にすることをお勧めします。

backgroundContext = [[NSManagedContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
backgroundContext.parent = self.managedDocument.managedObjectContext;

これで、バックグラウンド コンテキストで必要なことを行うことができます。バックグラウンド コンテキストを保存する場合は、変更がメイン コンテキストに詰め込まれます。もちろん、引き続き UIManagedDocument を保存する必要がありますが、これは ChangeDone カウントを設定することにより、バックグラウンドで「シームレスに」行われます。

[backgroundContext performBlock:^{
    [company parseAttributesFrom:xmlStr inManagedObjectContext:backgroundContext]; //self.managedDocument.managedObjectContext

    NSError *error = nil;
    [backgroundContext save:&error];
     if (error) NSLog(@"error: %@",error.localizedDescription);

    // NOTE: Now, the changes have been pushed into the main context of your document.
    // DO NOT call save directly on the managed document context.
    [self.managedDocument.managedObjectContext performBlock:^{
        [self.managedDocument updateChangeCount:UIDocumentChangeDone];
    }];
}];

これで、バックグラウンド コンテキストがなくなり、メイン コンテキストが変更を認識し、ドキュメントが保存されます。

于 2012-06-25T22:58:05.320 に答える