0

私はこれを機能させるために髪を引き裂いています。

私はすべての StackOverflow 関連の問題を見てきましたが、最終的なステップを機能させることができません!

NSFetchedResultsControllerCore Data からの表示データがあります。これはすべて完璧に機能します。そこにデータがある場合、データが表示され、すべて問題ありません。

ただし、オンライン サーバーからより多くのデータを取得して Core Data に保存する非同期更新があります。

私が望んでいるのは、NSFetchedResultsControllerこれらの更新を取得して表示することです(つまり、現在表示されているtableViewにアニメーション化します)。

今の編成はこんな感じです……

これに対する両方の応答に感謝します。これを機能させるためにもう一度試してみましたが、まだ「リアルタイム」で更新が表示されません。

私が今どこにいるのかを説明してみようと思いました。初期設定でいくつか問題が見つかりましたが、修正しましたが、まだ何もありません。

では、まずクラスと、どこで何が起こるか...

[クラス = AppDelegate]
[managedObjectContext (メイン コンテキスト) と永続ストアなどがあります...]
[メソッド = mergeChanges:notifiaction これは GCD を使用して mainThread に戻り、mergeChangesWithObjectblahblah を実行します]

[クラス = NetworkDataClass]
[これには、init 時に (メイン スレッドで) 作成される独自の ManagedObjectContext があります]
[メソッド = saveContext
1. bgContext の didsavenotification のオブザーバーとして AppDelegate を追加します。
2. コンテキストを保存します。
3. AppDelegate をオブザーバーとして削除] ( AppDelegate に保存時に停止するブレークポイントがあるため、観察が機能していることはわかっています。)
[メソッド = getDataFromOnline (実際の名前ではありませんが、要点はわかります)
1. bg スレッドへの GCD .
2. NSURLRequest を作成します。
3. 要求を同期的に実行します。
4. データをクラス コンテキストに入れます。
5. 自己 saveContext を実行します]

[クラス = tableViewClass]
[tableView を持ち、NSFetchedResultsController も NSFetchedResultsControllerDelegate を使用]
[メソッド = viewWillAppear
1. ネットワーク クラス シングルトンで getDataFromOnline メソッドを実行]

表示されていることを確認するためにいくつかのデフォルト データがそこにあり、tableViewClass (上記で詳述) に入ると、正しいセクション タイトルなどを使用して、正しい並べ替え順序でデータを正しく表示できます。 fetchedresultscontroller が機能していること。

getDataFromOnline メソッドを適切にトリガーすることも (ブレークポイントで) 確認できます。データが入ってくるのを確認でき、それが ManagedObject サブクラスを介して追加されているのを確認できます。これはすべて bgthread で行われています。

また、保存時に AppDelegate がその mergeChanges 関数を適切に実行していることもわかります。

私が見ることができないのは、テーブルが新しいデータで更新されていることだけです。

popToRootViewController を使用してテーブルに戻ると、すべての新しいデータがそこにあるので、マージが完了し、新しいデータが追加およびマージされたことがわかりますが、マージ時に表示されません。

足りないものはありますか?

テーブルで reloadData を実行する必要がありますか? fetchedresultscontroller から「再フェッチ」または何かを起動する必要がありますか?

これで本当に苦戦。

あなたが提供できる(より多くの)助けに感謝します。

4

1 に答える 1

0

私はあなたにいくつかの提案をして、いくつかの良いリンクにリダイレクトしようとします.

まず、あなたの質問について

マージを「監視」するために NSFetchedResultsController を追加する必要がありますか? それとも作成するだけで十分ですか?

Eimantasが提案したviewControllerように、デリゲートとして使用している を設定するだけですNSFetchedResultsController。これを行うには、NSFetchedResultsControllerDelegateクラスのメソッドを実装する必要があります。コンテキストが更新されると、フェッチされたコントローラーは変更に自動的に応答します。

NSManagedObjectContextObjectsDidChangeNotification のオブザーバーはどこに行く必要がありますか? これは AppDelegate (NSFetchedResultsController とは異なるクラス) に含まれていても問題ありませんか。

appDelegate に変更を登録してマージしても問題ありませんか。登録する通知がコンテキストから取得され、メイン スレッドで実行されることを確認してください。

追加する必要がある他のオブザーバーはありますか?

いいえ、NSFetchedResultsControllerDelegate大丈夫です。

これがどこで間違っているかを確認するためにできることはありますか? つまり、NSFetchedResultsControllerDelegate は、ブレークポイントを貼り付けることができるメソッドを実行する必要がありますか?

まず、コア データ通知に期待するオブジェクトが含まれているかどうかを確認できます。単純にログを置くことができます。

この SO の質問 (私が書いたもの) とJody Haginsによる相対的な回答を読むことをお勧めします。多分それは役に立つかもしれません。

NSFetchedResultsController は、別のコンテキストからの更新を表示しません

可能であれば、どういう意味かをよりよく説明していただけますか

Core Data からのデータを表示する NSFetchedResultsController があります。これはすべて完璧に機能します。そこにデータがある場合、データが表示され、すべて問題ありません。

?

別のスレッドで Core Data の挿入を実行していますか?

それが役立つことを願っています。

于 2012-06-17T21:51:50.727 に答える