私には一般的なアプリケーションパターンがあります。ユーザーはメインのViewControllerにデータを入力し、それをモーダルViewControllerのテーブルに表示します。ここで行を削除または変更できます。私はスタンフォードiPhoneコースの一般的な設計戦略に従っていましたが、どこかで問題が発生し、SIGABRTと、「異なるコンテキストのオブジェクト間に「xyz」の関係を確立しようとする違法な試み」などの例外が発生しました。
スタンフォードコースと同様に、「データベース」と呼ばれるシングルトンクラスを使用します。このクラスは、要求されるたびに同じコンテキストを返す必要があります。したがって、メインViewControllerのviewDidLoadメソッドの最初のコマンドは次のとおりです。
dbsingleton = [Database sharedInstance];
nmocontext = [dbsingleton managedObjectContext];
nmocontextは、ViewController全体で使用するivarです。ユーザーがテーブルを使用して他のViewControllerを表示したい場合は、それをalloc-initしてから、モーダルで表示します。(ストアからのデータを提供するNSFetchedResultsControllerがあります。)ここでさまざまな戦略を試しました。
- NSFetchedResultsControllerをメインビューコントローラーによって設定された保持プロパティにしました
- NSManagedObjectContextを、メインビューコントローラーによって設定された保持プロパティにしました。と
- テーブルビューコントローラーのviewDidLoadメソッドの先頭で上記の2行のコードを繰り返すことにより、内部でシングルトンを使用しました。
どちらを使用しても、解決できない問題の1つは、ユーザーがテーブルビューコントローラー(およびそのNSFetchedResultsController)を閉じてロックを解除した後、ストアにアクセスしたときにメインビューコントローラーでクラッシュが発生し始めることです(「上記の「不正な試行」エラー)。
この一般的なアプリケーションパターンに対処するためのベストプラクティスは何ですか?このアプリケーションをiPhoneSDK3.xと互換性を持たせたいと思っていますが、iOS 4を使用していると、クラッシュが少なくなるようです。3.xに根本的な問題があり、問題が発生している場合は、私に知らせてください。知っているし、私はiOS4のみをターゲットにするかもしれない。
ありがとうございました!