RestKit一对多反向关系(没有CoreData)

Kas*_*nck 9 iphone one-to-many ios restkit

建立

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

[Author] -- has many --> [Book]
Run Code Online (Sandbox Code Playgroud)

使用restkit,我有一个Author模型和Book模型,我创建了Author和Book之间的关系,如下所示:

[authorMapping hasMany:@"books" withMapping:booksMapping];
Run Code Online (Sandbox Code Playgroud)

我现在可以通过作者的财产访问作者的书籍:

@property (strong, nonatomic) NSSet *books;
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.同样,我想通过它的属性访问一本书的作者:

@property (weak, nonatomic) Author *author;
Run Code Online (Sandbox Code Playgroud)

问题

这就是问题的起点.为了实现这种反向关系,我添加了以下内容:

[booksMapping hasOne:@"author" withMapping:authorMapping];
Run Code Online (Sandbox Code Playgroud)

这导致每个映射递归地相互调用,直到程序死亡.一点都不好.检查文档我发现hasOne/Many:withMapping:方法只是调用mapKeyPath:toRelationShip:withMapping:所以那里没有真正的替代品.此外,添加映射如下:

[bookMapping mapKeyPath:@"author" toAttribute:@"author"];
Run Code Online (Sandbox Code Playgroud)

很明显,只是创建映射但实际上并没有将Author对象映射到Book的author属性.


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

Kas*_*nck 0

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

作者.m

- (void)loadBooksWithCompletionBlock..... {
    ...
    for (Book *book in result) {
        book.author = self;
    }
    ...
} 
Run Code Online (Sandbox Code Playgroud)

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

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

RestKit更新

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