2012-02-15 6 views
2

NSManagedObjectのカスタムコードをサブクラスのカテゴリに入れるのは、モデルの編集時にXcodeが生成されたサブクラスを上書きするため一般的な方法です。私はちょうどこれを確認したかった。クラス階層にすでに実装されているメソッドとカテゴリを組み合わせるのが悪いと言う人々がいるという例を見てきました。実際のカテゴリを持つクラスに既に実装されているメソッドがある場合や、すべての場合にのみ対応するかどうかはわかりません。カテゴリを持つNSManagedObjects

+0

私はこの質問に長い間苦労していましたが、最終的にはオブジェクト階層を変更したソリューションに行きました。あなたが興味を持っているなら、ここでそれについて読むことができます:http://bikepress.org/?p=1120。 – chris

答えて

3

カテゴリのメソッドをオーバーライドする際の問題は、通常は[super doSomething]のように元の実装を呼び出すことができないことです。通常、メソッドをオーバーライドするときは、元の実装が呼び出された後に、元の実装が実行される前に、そして/または後に余分なことをしたいことがあります。

非常にきれいな解決策の1つは、Xcodeが直接手で触れないNSManagedObjectサブクラスを生成させることです。代わりに、上書きされる心配なしに編集できる各Xcode生成のNSManagedObjectサブクラスの別のカスタムサブクラスを作成します。

Wolf Rentzschのmogeneratorは基本的にこのアプローチを使用しており、Xcodeが生成しない便利なメソッドをいくつか追加生成します。それは有用なツールになる可能性があるので、チェックアウトする価値があるかもしれませんが、モジェネレータはあなたがしようとしていることをする必要はありません。

+2

自動生成されたNSManagedObjectサブクラスのサブクラスを使用する場合 - どのように関係を処理しますか?オブジェクトAはオブジェクトBを持ち、メソッドdoSomethingを呼び出すが、doSomethingはBのサブクラスで定義されているが、Core DataはBのサブクラスを返さなかった。実際にはBを返す。 – Brian

+0

@Brianこれはあなたの質問に対する遅い答えです。しかし、ここでそれを修正する方法があります。自動生成されたNSManagedObjectサブクラスにプロパティがないようにします。カスタムメソッドのみが含まれています(つまり、抽象化も可能です)。次に、クラスAはこのクラスをサブクラス化し、独自のプロパティを持ちます。クラスBのメソッドを呼び出すと、クラスBが別の自動生成されたNSManagedObjectからそのメソッドを継承するため、クラスBのメソッドを呼び出すと、単純に機能します。つまり、スーパークラスはインタフェース(またはObj-cのプロトコル)になります。また、あなたのサブクラスはこのインターフェイスを実装するデータストレージです。 –

+0

@ブライアンもちろん、アンドリューの答えを逆転させる。スーパークラスは(Core Dataの観点から)触れられなくなっているので、サブクラスは好きなようにデータを変更することができます。 –