设置
想象作者与书籍之间的以下关系:
[Author] -- has many --> [Book]
使用RESTKIT,我有一个作者模型和书籍模型,然后在作者和书籍之间建立了关系:
[authorMapping hasMany:@"books" withMapping:booksMapping];
我现在可以通过作者的财产访问作者的书:
@property (strong, nonatomic) NSSet *books;
到目前为止一切都很好。同样,我想通过其属性访问一本书的作者:
@property (weak, nonatomic) Author *author;
问题
这是问题开始的地方。为了实现这种反相关关系,我添加了以下内容:
[booksMapping hasOne:@"author" withMapping:authorMapping];
这会导致每个映射递归致电,直到程序死亡。根本不好。检查我发现的文档/hasone/许多:使用图:方法只是调用mapkeypath:torelationship:withmapping:因此,那里没有真正的替代方案。此外,添加映射如下:
[bookMapping mapKeyPath:@"author" toAttribute:@"author"];
显然,只需创建映射,但实际上不会将作者对象映射到本书的作者属性中。
问题
如何使用RESTKIT(而不是Coredata)之间在两个或多个模型之间建立逆一对多关系?
注意:RESTKIT的较新版本使用不同的映射方案。
Note2:我认为在您的示例中,您的意思是:
[booksMapping hasOne:@"author" withMapping: authorMapping];
(不是书图)
这里的问题不是映射,您不应该将相同的映射定义到多对一的侧面,而是已经完成了此映射(在agrormapping中定义)。您只需要指向父项目的指针,而不是重复整个映射过程。
真正的问题是,您需要将父对象定义为子对象的属性,就nsdictionaries而言,使用自定义类别可能是可能的,但这不是RESTKIT支持用于转换对象的支持。
我的解决方案是我项目的特定的,但也可能适合他人。我在作者模型中添加了loadBooks
方法,该方法从API中获取了其所有书籍。这里的诀窍是贯穿所有已加载的书籍对象,并将其作者属性设置为自我。这样的东西:
作者
- (void)loadBooksWithCompletionBlock..... {
...
for (Book *book in result) {
book.author = self;
}
...
}
我不确定我对这种方法是否完全满意,但它适合这种特殊情况的需求。
在撰写问题时我不知道的另一件事是API(Woops)的确切响应。事实证明,API响应中的作者对象对其书籍一无所知。另一方面,API响应中的书籍对象始终知道其作者。获取作者的所有书籍都需要与/api/books/<author_id>
类似的呼叫,这是我在loadBooks...
方法中使用的终点。因此,建立我寻求答案的逆逆关系是
RESTKIT UPDATE
应该注意的是,在上述应用程序中,我没有使用最新版本的RestKit。在开发应用程序期间,RestKit发布了重大更新,这改变了几个事情的完成方式。这个问题是指RESTKIT&LT的版本。0.2。