2012-02-11 5 views
2

タスクの詳細:NSManagedObjectを代理人にするのは良い方法ですか?

私は、1-30個のハードウェアデバイスと同時に通信するアプリケーションを開発しています。各デバイスには独自のTCP接続があります。

したがって、私は、そのデバイスのいくつかのプロパティを表すentity "hardwareObject"を作成しました。値1と値2。

"hardwareObject"エンティティの一時的な属性として定義した接続ハンドラクラスを作成しました。 UIの変更では、コアデータオブジェクトが変更され、コアデータオブジェクト自体がvalue1またはvalue2の変更を送信するための接続を通知します。

デリゲートメソッドを介して新しいデータが到着したときに、 "hardwareObject"のインスタンスに通知したいので、その属性のデリゲートです。

NSManagedObjectをs.thの代理人にすることをお勧めします。良い練習ですか?

フォールトやその他のコアデータ関連の問題が発生する可能性がありますか? また、それぞれの接続ハンドラを処理し、必要に応じてコアデータオブジェクトと対話するsharedInstanceマスター接続ハンドラオブジェクトを作成する方がよいでしょうか?

答えて

0

これは完全に有効なデザインです。 NSManagedObjectsは、(管理対象オブジェクト)コンテキストで管理することができますが、NSManagedObjectを保持しても有効です。そのクラスに特別なビジネスロジックを実装したり、代理人にしたりすることは自由です。実際、コアデータがNSManagedObjectのサブクラス化を可能にする騒動の1つは、こうしたことができるようなものです。

コンテキストからオブジェクトを削除する必要がある場合は、クラスをデリゲートとして登録解除してください。

+0

NSManagedObjectサブクラスを "生きている"ようにするために代理プロパティを代わずに代理プロパティを保持することをお勧めしますか? – b00tsy

+0

'obj <-> delegate'関係があるときはいつでも、両方の関係(objとdelegate)が互いに関係を持っている限り有効であることを確認する必要があります。 * classic *アプローチは、デリゲートがobjを保持するアプローチです(例:ビューコントローラはテーブルビューを保持します)、objにはデリゲートへの弱い参照があります(テーブルビューにはビューコントローラに対する弱い参照があります)。これも使うことができますが、管理対象オブジェクトが破棄されたときに( '-didTurnIntoFault'の内部で)デリゲートとして自身を設定解除するようにする必要があります。さもなければあなたはぶら下がっているポインタを持っています。 –

0

悪い考えです。デリゲートは、少なくともデリゲート対象のオブジェクトと同じくらい長く存在する必要があり、管理対象オブジェクトのライフサイクルを制御することはできません。これはコンテキストによって処理されます。

あなたの質問に言及しているように、フォールティングも問題になる可能性があります。どの状態情報もあなたのコントロールから消える可能性があります。

さらに、これはMVCの重大な違反のように聞こえます。

+0

これはどのようにMVCに違反していますか?実際の状態変化を観察することは、MVCの不可欠な部分です。 KVCとは何ですか?最初のパラグラフでは、モデル変更オブザーバ(https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueCoding/Articles/KeyValueCoding.html)について説明します。 – Rob

+0

あなたはKVCについて話していますか?私はMVCについて話しています。彼らは2つの全く異なるものです。 – jrturton

+0

私のMVCポイントは、OPが実際にコントローラのモデルオブジェクトの一部を作るということでした。 – jrturton

関連する問題