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 属性。


问题

如何使用 RestKit 而不是 CoreData 在两个或多个模型之间创建反向一对多关系?

4

2 回答 2

2

注意:较新版本的 restkit 使用不同的映射方案

注2:我认为在你的例子中你的意思是:

[booksMapping hasOne:@"author" withMapping: authorMapping];(不是书籍映射)

这里的问题不是映射,您不应该将相同的映射定义为多对一,这个映射已经完成(在 authorMapping 中定义)。您只需要一个指向父项的指针,而不是重复整个映射过程。
真正的问题是您需要将父对象定义为子对象的属性,就 NSDictionaries 而言,这可能使用自定义类别,但 RestKit 不支持将其用于转换对象。

于 2013-02-10T21:41:47.457 回答
0

我的解决方案特定于我的项目,但也可能适用于其他人。我向我的 Author 模型添加了一个loadBooks方法,该方法从 api 中获取所有书籍。这里的技巧是遍历所有加载的 Book 对象并将其 Author 属性设置为 self。像这样的东西:

作者.m

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

我不确定我是否对这种方法完全满意,但它适合这种特殊情况的需要。

在写我的问题时我不知道的另一件事是来自 API 的确切响应(哇哦)。事实证明,API 响应中的 Author 对象对其书籍一无所知。另一方面,API 响应中的 Book 对象总是知道其作者。获取作者的所有书籍需要调用类似于,这是我在方法/api/books/<author_id>中使用的端点。loadBooks...因此,创建我寻求答案的反向一对多关系稍微复杂一些。

RestKit 更新

应该注意的是,在上述应用程序中,我没有使用最新版本的 RestKit。在应用程序的开发过程中,RestKit 发布了一个重大更新,改变了几件事的完成方式。这个问题指的是 RestKit < 0.2 的版本。

于 2013-02-12T20:19:54.820 回答