0

概要

  • コアデータを使用するiOSプロジェクトがあります
  • コアデータは、ビューコントローラと通知に使用されます

実装

  • と呼ばれるデータベースアクティビティ用のシングルトンクラスを作成しましたDatabaseEngine
  • appDelegatedidFinishLaunchingWithOptionsで、DatabaseEngineインスタンス化されます
  • DatabaseEngineビューコントローラと通知のプロパティ(委任)が含まれています
  • ビューコントローラので、デリゲートをビューコントローラインスタンスにviewDidLoad設定していますDatabaseEngine
  • データベースが開かれると、完了ハンドラー(デリゲートプロパティを介して)がメソッドを呼び出して、ViewControllerと通知をセットアップします

懸念事項(タイミングの問題)

  • DatabaseEngineが最初に作成され、その時点でビューコントローラviewDidLoadが実行されないため、DatabaseEngineデリゲートが初期化されないため、データベースがcompletionHandlerを実行するシナリオ(タイミングの問題)が発生する可能性がありますが、デリゲートはnil、タスクは実行されません

懸念に対処するために私がしたこと

  • ビューコントローラーのviewDidLoad内で、データベースが起動しているかどうかを確認しています。ロードされていない場合は、タスク(ビューコントローラーのビューの設定)を再度実行します。

注-私はスレッドを明示的に使用していませんが、私の理解に基づいて、completionHandlerは非同期で実行されます。

質問

  1. 何度か試しましたが、View Controllerのデータが正しく読み込まれ、タイミングの問題はないようです。大きな値をループして(遅延を作成するために)試しましたが、それでもタイミングの問題はありません。なんでだろう?
  2. 私の実装は良いデザインですか、それともこれを行うためのより良い方法がありますか?
  3. それは私の懸念に対処する正しい方法ですか?
4

2 に答える 2

1

あなたのデザインは少し複雑ですが、しっかりしているようです。(私はコアデータをアプリデリゲートで管理することを好みますが、必要に応じてアプローチも同様に問題ありません。)

ただし、DatabaseEngineクラスの遅延初期化の通常のパターンを使用します。このように、必要で実際には存在しない場合は、View Controllerがエンジンの呼び出しで何かが返されるまで待機している間、それ自体が作成され、必要な初期化ルーチンが実行されます。

// in view controller viewDidLoad, e.g.
self.managedObjectContext = [databaseEngine managedObjectContext];

コンテキストが初期化されていない場合は、ここで発生します。

于 2012-04-28T16:59:57.997 に答える
1

最善のアプローチも、アプリの代理人にデータを管理させることだと思います。最善のアプローチのようであり、それはデフォルトのCDアプリケーションテンプレートが行うことです。

MagicalRecordの使用を検討します。これは、私に言わせればかなり驚くべきことです。MagicalRecordを使用すると、呼び出す[NSManagedObjectContext MR_defaultContext];だけで、そのようなデフォルトのコンテキストを取得できます。MRには、次のようなすばらしいクラスメソッドも無料で用意されています。

NSArray *array = [SomeObject findAll]

これは、すべてのCDオブジェクトを含む配列を返します。述語などを設定することもでき、非常に高速です。

于 2012-04-28T17:34:56.567 に答える