2

NSFetchedResultsController からデータを取得するテーブルビューがあります。NSDate 属性に従って、データをセクションに編成します。各セクション内では、データも NSDate 属性によって編成されます。

ときどき、データを取得してリストを更新するために Web サービスを呼び出さなければならないことがあります。このデータは、既存のデータの挿入または更新です。

ここに私の問題があります: Core Data がデータの記録を終了すると、私の NSFetchedResultsController はデリゲートにいくつかの行を移動するように要求します...しかし、これらの行は移動ではなく更新されているはずです。

これらの行は、更新したばかりのいくつかのエンティティに対応しています。しかし、データの順序付けに使用する属性が更新されることはありません。これらの行は移動してはなりません! 実際、このバグは更新するすべてのエンティティで発生するわけではなく、一部のエンティティで発生します。彼らはいつも同じですが、特別なことは何もありません。他の人と同じです...

Apple のドキュメントで、移動されたオブジェクトが更新されたと報告されている記事を読みましたが、残念ながらそれは私の問題ではありません。

NSFetchedResultsController の作成 (リクエスト、述語、および sortDescriptors を含む)、NSFetchedResultsController によって通知された変更の処理、データの登録など、多くのコードが実行されています。投稿します。

よろしくお願いします!

4

1 に答える 1

0

推測ですが、おそらく更新とWebサービスに同じコンテキストを使用しています。はいの場合、少なくとも2つのコンテキストが必要です。1つはコントローラー用、もう1つは更新用です。

次に、2つをマージして、フェッチされたコントローラーが委任されないように一時的に辞任することができます。そして、更新が終了したら再割り当てしてから、フェッチを再発行します。UIをしばらくフリーズさせる可能性のある多くのセルの移動を回避します。

また、NSFetchedResultsControllerは、コンテキストの保存だけでなく、新しいエンティティが作成されたが保存されていない場合にも反応します。

これは、次のように呼び出すことによって行われます。

NSManagedObject *mo = [[NSManagedObject alloc] initWithEntity:myEntityDesc insertIntoManagedObjectContext:ctx];

新しいセルがテーブルビューでその場所に配置され、他のすべてのセルが移動されます。

'move'が呼び出された場合、UIViewControllerはフェッチされたコントローラーのデリゲートであるように聞こえます。

通常の方法は、少なくとも私にとって、または私が周りで見たものから、コントローラーにフェッチを再発行させてから、テーブルビューでreloadDataを呼び出すことです。

それ以外の場合は、関係を変更しても、コントローラーはそれらの変更に反応することに注意してください。

デバッグするには、UIViewControllerをNSManagedObjectContextObjectsDidChangeNotification NSManagedObjectContextObjectsDidSaveNotificationのオブザーバーとして登録し、ブレークポイントを設定して、どのプロパティが間違った移動をトリガーしているかを確認します。

于 2013-01-29T09:59:30.640 に答える