9

設定

Author と Book の間の次の関係を想像してください。

[Author] -- has many --> [Book]

restkit を使用して、Author モデルと Book モデルがあり、Author と Book の関係を次のように作成します。

[authorMapping hasMany:@"books" withMapping:booksMapping];

著者のプロパティから著者の本にアクセスできるようになりました。

@property (strong, nonatomic) NSSet *books;

ここまでは順調ですね。同様に、本のプロパティを介して本の著者にアクセスしたいと思います。

@property (weak, nonatomic) Author *author;

問題

ここから問題が始まります。この逆の関係を実現するために、次を追加しました。

[booksMapping hasOne:@"author" withMapping:authorMapping];

これにより、プログラムが終了するまで、各マッピングが相互に再帰的に呼び出します。全然ダメ。ドキュメントを調べると、hasOne/Many:withMapping: メソッドは単に mapKeyPath:toRelationShip:withMapping: を呼び出しているだけなので、実際には代替手段はありません。さらに、次のようにマッピングを追加します。

[bookMapping mapKeyPath:@"author" toAttribute:@"author"];

明らかに、マッピングを作成するだけで、実際に Author オブジェクトを Book の author プロパティにマップするわけではありません。


質問

CoreData ではなく RestKit を使用して、2 つ以上のモデル間に逆の 1 対多の関係を作成するにはどうすればよいですか?

4

2 に答える 2

2

注: restkit の新しいバージョンでは、異なるマッピング スキームが使用されます。

注2:あなたの例では、次のことを意味していると思います:

[booksMapping hasOne:@"author" withMapping: authorMapping];(booksMapping ではありません)

ここでの問題はマッピングではありません。同じマッピングを多対 1 側に定義するべきではありません。このマッピングは既に行われています (authorMapping で定義されています)。マッピングプロセス全体を繰り返すのではなく、単に親アイテムへのポインターが必要です。
本当の問題は、親オブジェクトを子オブジェクトのプロパティとして定義する必要があることです.NSDictionariesに関しては、これはカスタムカテゴリを使用して可能かもしれませんが、RestKitが変換されたオブジェクトに使用することをサポートしているものではありません.

于 2013-02-10T21:41:47.457 に答える
0

私のソリューションは私のプロジェクトに固有のものですが、他のプロジェクトにも適している可能性があります。loadBooksAPI からすべての本を取得するメソッドを Author モデルに追加しました。ここでの秘訣は、ロードされたすべての Book オブジェクトを実行し、それらの Author プロパティを self に設定することでした。このようなもの:

著者.m

- (void)loadBooksWithCompletionBlock..... {
    ...
    for (Book *book in result) {
        book.author = self;
    }
    ...
} 

このアプローチに完全に満足しているかどうかはわかりませんが、この特定の状況のニーズには合っています。

質問を書いている時点で気付いていなかったもう 1 つのことは、API からの正確な応答です (おっと)。API 応答の Author オブジェクトは、その本について何も知らないことがわかります。一方、API 応答の Book オブジェクトは常にその Author を認識しています。Author のすべての書籍を取得するには、メソッド/api/books/<author_id>で使用するエンドポイントであるのような呼び出しが必要です。loadBooks...したがって、私が答えを探していた逆の 1 対多の関係を作成するのは少し複雑です。

RestKit アップデート

上記のアプリケーションでは、RestKit の最新バージョンを使用していないことに注意してください。アプリの開発中に、RestKit はメジ​​ャー アップデートをリリースし、いくつかの方法が変更されました。この質問は、RestKit < 0.2 のバージョンに関するものです。

于 2013-02-12T20:19:54.820 に答える