1

iPhone開発者にとってはかなり新しい。私のアプリはコアデータを使用しており、ある時点でNSFe​​tchedResultsControllerDelegateメソッド中にいくつかのデータを保存しようとしています。

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
   atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
  newIndexPath:(NSIndexPath *)newIndexPath {

私はこの主題に関するAppleのドキュメンテーションからこれのほとんどを正しく得ています。削除アクションは次のようになります。

case NSFetchedResultsChangeDelete:
        [managedObjectContext deleteObject:anObject];
        NSError *error;
        if (![managedObjectContext save:&error]) {
            NSLog(@"WTF? %@", [error description]);
        }
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                         withRowAnimation:UITableViewRowAnimationFade];
        break;

さて、これを行うと、必然的なクラッシュの後に問題のオブジェクトが削除されます。だから何か正しいことが起こっています。ただし、クラッシュは興味深いものです。

重大なアプリケーションエラー。Core Data変更処理中に例外がキャッチされました:保存前に保留中の変更を処理できませんでした。100回試行しても、コンテキストはまだダーティです。通常、この再帰的なダーティは、不適切な検証メソッド、-willSave、または通知ハンドラーが原因で発生します。userInfo(null)を使用

2010-02-09 23:02:03.931 app2 [26664:207]***キャッチされなかった例外'NSInternalInconsistencyException'が原因でアプリを終了しています。理由:'保存前に保留中の変更を処理できませんでした。100回試行しても、コンテキストはまだダーティです。通常、この再帰的なダーティは、不適切な検証メソッド、-willSave、または通知ハンドラーによって引き起こされます。

私の研究では、非常に限られた結果しか得られていません。これを文書化するためにここにあるのは良いことですよね?:-)しかし、私の腸は、MOCが私のコントローラーの他の場所に書き込まれていると言っていますが、それが起こっているという証拠は見つかりません。viewDidLoadメソッドでは、初期データの取得にNSFetchedResultsControllerが使用されていますが、それだけです。

ここで何が間違っている可能性があるかについての提案はありますか?いつものように、あなたのコミュニティベースの集合精神は非常に高く評価されています!

乾杯、アーロン

4

1 に答える 1

3

(私が問題を正しく理解していれば)この場合あなたがする必要があるのは:

case NSFetchedResultsChangeDelete:

        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                         withRowAnimation:UITableViewRowAnimationFade];
        break;

その方法を覚えておいてください

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath 

基になるデータが変更された後に通知されます。したがって、オブジェクトはすでに削除されていると思います。手動で削除する必要はありません。このメソッドで実行する必要があるのは、tableViewから削除することだけです。

お役に立てれば!

于 2010-02-10T04:38:08.873 に答える