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

时间:2012-10-29 20:20:54

标签: iphone ios restkit one-to-many

设置

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

[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?

2 个答案:

答案 0 :(得分:2)

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

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

[booksMapping hasOne:@"author" withMapping: authorMapping];(不是bookMapping)

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

答案 1 :(得分:0)

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

Author.m

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

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

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

RestKit更新

应该注意的是,在上述申请中,我没有使用最新版本的RestKit。在应用程序开发过程中,RestKit发布了一个重大更新,改变了几个方面的工作方式。这个问题涉及RestKit的版本&lt; 0.2。