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)的主要内容,如果未能解决你的问题,请参考以下文章