RestKit 一对多逆向关系(无CoreData)

Posted

技术标签:

【中文标题】RestKit 一对多逆向关系(无CoreData)【英文标题】:RestKit one-to-many inverse relationships (without CoreData) 【发布时间】:2012-10-29 20:20:53 【问题描述】:

设置

想象一下作者和书之间的以下关系:

[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 在两个或多个模型之间创建反向一对多关系?

【问题讨论】:

Muncken,您是否有不想使用 Core Data 的特定原因?我发现 Core Data 非常值得最初的学习曲线,它使对象关系映射非常简单。 加载的数据一直在变化,所以我没有理由坚持下去(作者->书案只是一个简化的例子来说明问题)。此外,我发现 coredata 使测试显着复杂化,因此我定义使用它会弊大于利(不过,我确实找到了 Graham Lee 的博客文章 bit.ly/UNzKFL,这有助于解决测试问题,稍后)。 【参考方案1】:

注意:较新版本的 restkit 使用 a diffent mapping scheme。

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

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

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

【讨论】:

感谢凯文的回答。我最终使用了另一个解决方案,我稍后会提交。顺便说一句,有一篇与您在 NSHipster 上的链接相关的精彩帖子:nshipster.com/kvc-collection-operators【参考方案2】:

我的解决方案是针对我的项目的,但也可能适用于其他人。我在我的 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

【讨论】:

以上是关于RestKit 一对多逆向关系(无CoreData)的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 0.2 映射 Core Data <--> JSON 与一对多关系

CoreData:通过关系访问对象

RestKit 一对多关系逆映射

Restkit, Swift, Core data 一对多

RESTKit:具有一对多关系的 POST

RestKit嵌套的一对多关系映射很慢