5

テーブルビューを使用して、コアデータからアイテムのリストを表示するアプリケーションがあります。私はリモートAPIを使用しており、テーブルビューをプルダウンした後にコンテンツを更新しています。これにより、APIへの呼び出しがトリガーされます。NSFetchedResultsControllerデリゲート例外

データが取得され、解析され、コアデータに挿入/更新されます。

私は時にはコアデータコンテキストを保存した後にエラーが発生します...私はこれに複数のスレッドを使用していないことに注意してください。

私は文字通りかなり怒っています。

2012-07-31 14:14:47.332 MyApp[2893:11303] 
*** Assertion failure in -[_UITableViewUpdateSupport _setupAnimationsForNewlyInsertedCells], 
/SourceCache/UIKit_Sim/UIKit-1914.84/UITableViewSupport.m:1133 
2012-07-31 14:14:47.332 MyApp[2893:11303] CoreData: error: Serious application error. 
An exception was caught from the delegate of NSFetchedResultsController during a call to - 
controllerDidChangeContent:. 
Attempt to create two animations for cell with userInfo (null) 

UPDATE::私が持っている

ここCoreData error driving me crazy... CoreData: Serious application error. An exception caught from delegate of NSFetchedResultsController

は完全なエラーである:この男は同様の問題を持っていますが、私はまだ彼の溶液で鉱山を修正することができないんだそうですフェッチ要求の述語。以前にAPIからダウンロードしたオブジェクトを削除しているように見えるため、新しいJSONの結果から欠落しています。 hideFromUserフラグを設定していますが、これは私のCore Dataに保存されています。

このフラグがYESの場合、テーブルビューには表示されません。しかし、それが大丈夫ならそれはそうです。私は何か変更があった場合、その管理オブジェクトに関する情報も更新しています。以前隠すように設定されたオブジェクトを持っていて、表示するように設定されている可能性はありますか?また、新しいデータがありました。この "セルは更新する必要がありますか?

さらに詳しくは、それほど関連性が低いと思われます。ここで

は、私は私のデータを更新しています方法です:

1)私は、「非表示のフォームのユーザー」(NSPredicateは、彼らが表形式で表示されませんが保証)に対応するタイプのすべての関連オブジェクトを設定します。

2)私はJSONデータからNSArrayを取得します。

3)私のcreateABookOfClass:withJSON:メソッドは、各項目をループする(json辞書のIDを使用して)ブックのコアデータを検索し、見つからなければ新しいものを作成します。注:この時点で、「ユーザーからの隠蔽」フラグは元に戻されます。

4)結局、保存します。何が起こっていることは、Aが更新されたオブジェクトを含むセルである

[[DPLocalStore getInstance] hideFlagItemsOfType:NSStringFromClass([MyFavouriteBook class])]; 

NSArray * itemsJSON = [data mutableObjectFromJSONData]; 

[itemsJSON enumerateObjectsUsingBlock:^(NSDictionary *obj, NSUInteger idx, BOOL *stop) {  
    [[DPLocalStore getInstance] createABookOfClass:[MyFavouriteBook class] 
              withJSON:obj]; 
}]; 

NSError *error = nil; 
BOOL didsave = [[DPLocalStore getInstance] save:&error]; 

はたぶん、それは更新です:非表示フラグが変更されました。したがって、私はNSFetchedResultsControllerの代理人がそのセルを更新したい、そしてそれを削除したいという状況に陥っています...述語が今このオブジェクトに対応していないので...その音が非常にそうである...

+1

データを挿入/更新するコードを投稿できますか? –

+0

実際にjson配列を解析してループを作成した後、nsmanagedobjectsの束を簡単に作成するだけです。特別なことは何も起こっていません。もしあなたが私のBitBucketレポへのアクセス権を与えたら?多分この1つのセルの2つのアニメーション...私はちょうど考えていた、私の更新された質問を確認してください。ありがとう。 – Daniel

+0

ヘット・マーティン、あなたが言ったように、私の答えをチェックしてください。乾杯。 – Daniel

答えて

9

I私はそれを変更して以来、私は問題を経験していないので、私はそれが大丈夫だと仮定しているエラーを見つけたかもしれないと思う。

controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:の私の実装では、私はNSFetchedResultsChangeMoveのためのswitch文でこれを持っていた:

case NSFetchedResultsChangeMove: 
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
        withRowAnimation:UITableViewRowAnimationFade]; 

    // Reloading the section inserts a new row and ensures that titles are updated appropriately. 
    [tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] 
      withRowAnimation:UITableViewRowAnimationFade]; 
    break; 

をそれは(私はの一部ではありませんでした)古いプロジェクトで使用されたように、私は全体controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:実装がいたと仮定しましたこれは本当にテンプレートではなく、カスタマイズされたものを実行するためのものです。

アップルのデベロッパーサイトでもう一度読んでみるまで、私はそれにあまり注意を払っていませんでした。そして私が気付いたのは、NSFetchedResultsChangeMoveの場合は、セルを削除して、そのセルを新しいパスに挿入する必要があります。しかし、私は本当に実現せずに実装していた - セルを削除し、セクションを再読み込み!

case NSFetchedResultsChangeMove: 
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
        withRowAnimation:UITableViewRowAnimationFade]; 
    [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] 
        withRowAnimation:UITableViewRowAnimationFade]; 
    break; 

私はので、問題を抱えていませんでした言ったように:私がすべき効果で

、今は以下の持っています。内部の仕組みがこれを担当することを誰にも知りたいと思う - 例外は「細胞のために2つのアニメーションを作成しようとした」。

ありがとうございます。

+0

あなたは私の一日を保存しました、ありがとう! –

+0

私はそこにいくつかのチュートリアルやソースコードがあると思います。コピーして使用しました。これは定型的なものなので... Appleは(正しい)実装も行っているhttp://developer.apple.com/library/ios/#documentation/CoreData/Reference/NSFetchedResultsControllerDelegate_Protocol/Reference/Reference.html – Daniel

+0

このコードはまだ違う。挿入/更新/削除のためのテーブルビューアクションの周りでbeginUpdateとendUpdateを呼び出すことになっています。 beginUpdate/endUpdatesをネストして、同期テーブルビューのアニメーションの時間を設定します。このため、アニメーションエラーが重複しています。 – Derek

関連する問題