「汚い」コアデータコンテキスト:MOCがクラッシュアプ​​リを保存

StackOverflow https://stackoverflow.com/questions/2234359

質問

iPhone devのにかなり新しいです。マイアプリのコアデータを使用し、ある時点で、私はNSFetchedResultsControllerDelegate方法の間にいくつかのデータを保存しようとしています:

- (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;
私はこれを行う際に、

さて、問題のオブジェクトは、避けられないクラッシュした後に削除されます。だから、何かが右に起こっています。クラッシュは、しかし、興味深いものです。

  

重大なアプリケーションエラー。例外は、コアデータ変更処理中にキャッチされました:保存する前に保留中の変更の処理に失敗しました。コンテキストは、100回の試行後、まだ汚れています。典型的には、この再帰汚すは悪い検証方法、-willSave、または通知ハンドラによって引き起こされます。ユーザー情報(ヌル)と

     

2010-02-09 23:02:03.931 APP2 [26664:207] ***キャッチされない例外により 'NSInternalInconsistencyException'、理由にアプリを終了:「保留中の変更は、以前に保存処理できませんでした。コンテキストは、100回の試行後、まだ汚れています。典型的には、この再帰汚すが悪い検証方法、-willSave、または通知ハンドラによって引き起こされる。 '

えっ、私はこれを文書化するためにここに持っている良いことだ -

私の研究は、いくつかの非常に限られた成果を上げたのか? :-)しかし、私の腸は、私はその出来事の証拠を見つけることができませんけれどもMOCは、私のコントローラ内の別の場所に書き込まれていると言っています。 viewDidLoadメソッドはNSFetchedResultsControllerは、初期データを取得するために使用されているが、それはそれだ。

ここで間違っているかもしれないもの上の任意の提案?いつものように、あなたのコミュニティベースのハイブの心は非常に高く評価される!

乾杯、アーロン

役に立ちましたか?

解決

(私が正しく問題を理解していれば) 私はあなたがこのような場合に必要なことだと思うことはあります:

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からそれを削除しています。

この情報がお役に立てば幸い!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top