2

これはObjective-J/Cappuccinoの質問ですが、フレームワークが非常に似ているため、ココアタグを追加しました。

カプチーノの欠点の1つは、CoreDataがまだ移植されていないため、すべてのモデルオブジェクトを手動で作成する必要があることです。

CoreDataでは、逆の関係が自動的に管理されます...別のオブジェクトのto-many関係にオブジェクトを追加すると、グラフを両方向にトラバースできます。

CoreDataがなければ、これらの逆の関係を自動的に設定するクリーンな方法はありますか?

より具体的な例として、典型的な部門と従業員の例を見てみましょう。レールの用語を使用するために、Departmentオブジェクトには多くのEmployeesがあり、EmployeeはDepartmentに属しています。

したがって、Departmentモデルには一連のEmployeesを含むNSMutableSet(またはCPMutableSet)の「employees」があり、Employeeモデルにはそれを所有するDepartmentモデルを指す変数「department」があります。

新しい従業員モデルをセットに追加すると、逆の関係(employee.department)が自動的に設定されるようにする簡単な方法はありますか?またはその逆:従業員の部門モデルを設定すると、その部門の従業員セットに自動的に追加されますか?

すべてのモデルがサブクラスであるオブジェクト「ValidatedModel」を作成していることを知っています。これは、KVOを使用して逆の関係を設定するいくつかのメソッドを追加します。しかし、私は多くの無意味な仕事をしていること、そしてこれを行うためのより簡単な方法がすでにあることを恐れています。

誰かが私の懸念を休ませることができますか?

4

4 に答える 4

2

Objective-Jと具体的に話すことはできませんが、Core Dataなしでこれを行う通常の方法は、セッターで逆の関係を設定することです。したがって、employees / departmentsの例を使用すると、次のようになります。

- (void)setDepartment:(Department *)aDepartment {
    if (department == aDepartment)
        return;

    [department release];
    department = [aDepartment retain];

    [department addEmployee:self];
}

新しい値がすでに既存の値と一致している場合は、インスタンス変数を更新しないようにする必要があります。そうしなかった場合は、setDepartment:を呼び出しaddEmployee:、無限ループでaddEmployee:呼び出します。setDepartment:

また、これは保持サイクルへのオープンな招待であることに注意してください。モデルがどのように構造化されているかによって異なりますが、もう一方を「所有」するオブジェクトがそれを必要とするオブジェクトですretain。ですから、私の例はおそらく最良ではありません。なぜなら、部門が従業員を「所有している」と言う方がおそらくより正確だからです。

于 2009-10-05T18:50:01.227 に答える
2

あなたはおそらくあなたのセッターで関係を設定したいと思うでしょう。あなたの例を使用すると、Objective-Jコードは次のようになります。

- (void)setDepartment:(Department)aDepartment {
    if (department === aDepartment)
        return;

    [department addEmployee:self];
}

ご覧のとおり、保持/解放する必要はありません。Objective-Jは、ガベージコレクションされたjavascriptに基づいて構築されています。すべてのメモリ管理メソッドが実装されていますが、何もしません(コードが乱雑になることを除いて)

また、これはjavascriptであるため、タイプの同等性を確認することをお勧めします(===)タイプの同等性の詳細については、http ://www.webreference.com/js/column26/stricteq.htmlを参照してください。

于 2009-10-05T19:33:07.220 に答える
2

この280Northの従業員からのCappuccinoExtensionsをチェックしてください:http://github.com/nciagra/Cappuccino-Extensions

ActiveRecordポートが含まれています。私は実際にこれを間近で見たことがありませんが、それはあなたを助けるかもしれません。

  • ヨハネス
于 2009-10-06T06:59:31.760 に答える
1

rbartolomeによるCoreDataのこの実装を確認することもできます。少しだけ見てきましたが、スタートのようです。

http://github.com/rbartolome/CoreData-カプチーノ

于 2010-06-13T20:58:36.533 に答える