想象一下作者和书之间的以下关系:
[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属性。
如何使用RestKit创建两个或多个模型之间的反向一对多关系,而不是CoreData?
答案 0 :(得分:2)
注意:较新版本的restkit使用a diffent mapping scheme。
注意2:我认为你的例子意思是:
[booksMapping hasOne:@"author" withMapping: authorMapping];
(不是bookMapping)
这里的问题不是映射,你不应该定义相同的映射到多对一方,这个映射已经完成(在authorMapping中定义)。您只需要指向父项的指针,而不是重复整个映射过程。
真正的问题是您需要将父对象定义为子对象的属性,就NSDictionaries而言,使用custom category可能是可能的,但RestKit不支持将其用于转换对象
答案 1 :(得分:0)
我的解决方案特定于我的项目,但也可能适合其他人。我在我的作者模型中添加了loadBooks
方法,该方法从api中获取所有书籍。这里的技巧是运行所有加载的Book对象并将其Author属性设置为self。像这样:
- (void)loadBooksWithCompletionBlock..... {
...
for (Book *book in result) {
book.author = self;
}
...
}
我不确定我对这种方法是否完全满意,但它适合这种特殊情况的需要。
在撰写我的问题时,我还没有意识到的另一件事是来自API(woops)的确切反应。事实证明,API响应中的Author对象对其书籍一无所知。另一方面,API响应中的Book对象始终知道其作者。获取作者的所有书籍需要类似于/api/books/<author_id>
的调用,这是我在loadBooks...
方法中使用的端点。因此,创建我寻求答案的逆一对多关系会稍微复杂一些。
应该注意的是,在上述申请中,我没有使用最新版本的RestKit。在应用程序开发过程中,RestKit发布了一个重大更新,改变了几个方面的工作方式。这个问题涉及RestKit的版本&lt; 0.2。