2

私の話に興味がない場合は、一番下にある 2 つの番号付きの質問にジャンプしてください。

この質問では、CoreData 処理を AppDelegate から分離するかどうかについて説明します。関心の分離方法を試すことにしました。

Apple は AppKit アプリケーションのトピックに関するドキュメントを提供していないため、私の質問は次のとおりです。

  • CoreData スタックを AppDelegate から分離する方法を示すドキュメント、リソース、またはサンプル プロジェクトはありますか?

私の現在の状態は次のとおりです。

AppDelegateDataControllerサブクラスである がありNSTreeControllerます。は、モデルのオブジェクト (グループとリーフ) を表示DataControllerするコントロールです。NSOutlineViewCoreData

CoreDataXcodeの (ドキュメント ベースではない) テンプレートから始めました。

  • CoreData-Stack 関連のすべてのメソッドを から に移動しAppDelegateましたDataController
  • 私はDataControllerシングルトンを作りました。
  • 真のAppDelegate関連メソッドを次のDataControllerように転送しました:

AppController.m 内

- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window{
    return [[[DataController sharedController] managedObjectContext] undoManager];
}
- (IBAction)saveAction:(id)sender{
    [[DataController sharedController] saveAction:sender];
}
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender{
    return [[DataController sharedController] applicationShouldTerminate:sender];
}
  • もちろん、呼び出されたメソッドはすべて DataController.m に実装されています。

でオブジェクトを追加および削除できるようになりNSOutlineView、元に戻すとやり直しも機能します。ただし、File-Save メニュー項目はグレー表示されています。cmd+s を押すと、OS から bing が表示されます。(これは、AppDelegate に CoreData スタックがあったときに「魔法のように」機能していました。)

アプリケーションを終了すると、のオブジェクトが呼び出しを通じて (xml を見た) にOutlineView書き込まれます。ただし、アプリケーションを再起動すると、オブジェクトは .xml ファイルに復元されません。(これは、AppDelegate に CoreData スタックがあったときに「魔法のように」機能していました。)persistentStoreapplicationShouldTerminateOutlineView

  1. テンプレートに隠されている魔法の接着剤コードは何ですか? CoreDatacmd+s を機能させ、[ファイル] - [保存] メニュー項目を有効にしますか?
  2. アプリケーションの起動時mangedObjectContextに myのコンテンツを my に復元する隠しコード。OutlineView
4

1 に答える 1

0

これを行う iOS 用のフレームワークを作成しました。私のアプローチでは、AppDelegate から Core Data ボイラープレート コードを取得し、それをシングルトン クラスに移動します。これにより、AppDelegate から完全に分離され、View NSManagedObjectContextController 間で a を渡す必要がなくなり、フレームワークをプロジェクトにコピーするだけで Core Data をアプリケーションに追加できます。

フレームワークについては、 http://schwiiz.org/? p=1120で読むか、 https://github.com/chriscdn/RHManagedObjectからダウンロードできます。

フレームワークは単なるシングルトンではありません。またNSManagedObject、異なるスレッド間での保存やフェッチなどを簡素化するために拡張されています。

于 2012-08-22T06:11:09.333 に答える