UITableView で object を追加した直後に削除すると error

またハマりました。UITableView で insertObject し、直後にその object を削除すると error。エラーメッセージがまた大層なもので、こんな感じ。

[error] error: Serious application error.  Exception was caught during Core Data change processing.  This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification.

何これ? CoreData のバグじゃないのと思ったんだけど、そうではなくて、beginUpdate を実行していなかったから。以下の method に書いておくべき。

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller

ところで、beginUpdate したら、endUpdate はどうするの?と思ったらそれは次の method で実装していた。

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller

endUpdate しているのに、対となる beginUpdate が宣言されていないのでエラーになっていたというわけ。試しに、begin も end もコメントにしてみたらエラーは出なくなる。これ、なくてもなくても良いものなのだろうか。Apple の Document 読んでみたら、insert, delete とかするときは begin-end の block を使わないと table attribute such as row count とかがおかしくなっちゃうよ、とあるので、書いおいたほうがよさそう。も少し詳しく調べてみたら、例えば、ある行を削除すると index は前に詰まりますが、begin-end block 内では削除前の index を保持しているそうです。ちょっと高尚なことをしようとすると、削除前の index も参照したいよねということはあり得る話。なので、やっぱり begin-end block を使えということ。ただ、エラーにならないので必須ではないと。もちろん、自身のエラーのように、begin-end のどちらか一方だけというのは論外・・・

この TableView は storyboard に手動で追加したものなので、必要な method は自分で書かなければならず、色々と漏れている method があるなと。

さて、次は アプリのプログラムに必要なデータで、category table の data を iCloud から取ってくるか・・・