1

今日、スタック オーバーフローに関するすべての CoreData の質問を読んだような気がしますが、まだ非常に行き詰まっています。:)

私は、スタンフォード大学の cs193p 講義 14 (Photomania アプリ) で説明されている方法に基づいた CoreData を使用するアプリケーションに取り組んでいます。これは、NSFetchedResultsController デリゲートを実装する UITableViewController サブクラスを使用します。もちろん、テーブルは結果がフェッチされると自動的に更新されます。

すべてが機能しますが、ドキュメントにデータが入力されると UI がブロックされます。これは、メイン スレッド (ドキュメントの managedObjectContext) で発生するためです。すでにバックグラウンド スレッドでデータをダウンロードしています。これは、ブロッキングの原因となっている NSManagedObjects を実際に設定するコードにすぎません。この講義では、NSManagedObjectContext の Parent コンテキストを使用して Document をバックグラウンドでロードし、メインスレッドでデータを「再フェッチ」してテーブルにデータを入力することをほのめかしています。テーブルに二重のエントリが頻繁に表示されることを除けば、ほとんど機能しています(と思います)。[self.tableView beginUpdates] / [self.tableView endUpdates] のようなものは解決されるようですが、バックグラウンド コンテキストで NSManagedObjectContext の保存を行っているため、どこに置くかわかりません。

私はまた、これについて完全に間違った方法で進んでいるかもしれません。:) いずれにしても、関連するコードは次のとおりです。

NSManagedObjectContext *backgroundContext;
backgroundContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
// document is my UIManagedDocument
backgroundContext.parentContext = document.managedObjectContext; 

[backgroundContext performBlockAndWait:^{             
     // Do stuff here to populate the document.             
     [backgroundContext save:nil];
}];
4

3 に答える 3

1

あなたがそうするように言っているので、それはまだ待っています。performBlock を使用して、独自のスレッドで動作できるようにします。

[backgroundContext preformBlock:^{
    // Do your background stuff
    [backgroundContext save:&error];  // handle the error
    [document.managedObjectContext performBlock:^{
        // Tell the document it has dirty data and should save
        [document updateChangeCount:UIDocumentChangeDone];
        // Do any UI-related stuff
    }];
}];

フェッチされた結果コントローラーは、変更がメイン コンテキストにプッシュされると自動的に更新されます。

于 2012-05-18T22:26:34.120 に答える
0

あなたのコードからは、問題が実際にどこにあるのかよくわかりません。あなたはその「ドキュメント」が何であるか、あなたがロードしていることをあまり明確にしませんでした。とにかく、あなたを助けるかもしれないもの:バックグラウンドスレッド(あなたが持っている)でロード全体を試して、テーブルビューコントローラーに更新について知らせる通知を投稿してから、コントローラーに次のようにメッセージを送ってください:

[self.tableView reloadData];

beginUpdatesその場合、 norは必要ありませんendUpdatesが、それらを使用する必要がある方法(通常、およびでNSFetchedResultsController使用するデリゲートメソッド)を見つけた場合は、データを更新する直前と更新後にこれらのメッセージを送信します。-(void)controllerWillChangeContent:(NSFetchedResultsController *)controller- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller

それが少し役立つことを願っています…</p>

于 2012-05-18T21:42:36.733 に答える
0

理由はわかりませんが、これで問題は解決しました:https ://stackoverflow.com/a/9451450/314051 。具体的には、[backgroundContext save]の直前:

NSSet *inserts = [backgroundContext insertedObjects]; 
[backgroundContext obtainPermanentIDsForObjects:[inserts allObjects] error:&error]; 

その理由を正確に理解するために、いくつかの調査を行う必要があります。提案に感謝します。これは、これがUIの問題ではないと判断するのに役立ちました。

于 2012-05-20T14:06:44.317 に答える