RestKit 与 Core Data 多对多:它有效,但我做得对吗?

Posted

技术标签:

【中文标题】RestKit 与 Core Data 多对多:它有效,但我做得对吗?【英文标题】:RestKit many-to-many with Core Data: it works, but am I doing it right? 【发布时间】:2012-04-11 16:34:38 【问题描述】:

我是 RestKit 的新手。我正在尝试在实体空间和用户之间映射多对多关系。就本问题而言,假设所有 Space 对象都已正确地位于 Core Data 存储中。

在 REST API 中,我可以通过一次调用来获取给定空间的所有用户。首先,当我初始化我的网络获取类时,我设置了一个适合解析用户列表的映射:

RKManagedObjectMapping *teamMapping = [RKManagedObjectMapping mappingForEntity:[NSEntityDescription entityForName:@"User" inManagedObjectContext:self.manager.objectStore.primaryManagedObjectContext] inManagedObjectStore:self.manager.objectStore];

[teamMapping mapKeyPath:@"id" toAttribute:@"userID"];
[teamMapping mapKeyPath:@"name" toAttribute:@"name"];
teamMapping.primaryKeyAttribute = @"userID";
[self.manager.mappingProvider setMapping:teamMapping forKeyPath:@"users.user"];

然后,为了填充用户到空间的链接,我这样做:

NSArray *spaces = [self.managedObjectContext executeFetchRequest:[NSFetchRequest fetchRequestWithEntityName:@"Space"] error:nil];

for (QBSpace *space in spaces)

    [self.manager loadObjectsAtResourcePath:[NSString stringWithFormat:@"space/%@/users", space.wikiName] usingBlock:^(RKObjectLoader *loader) 
        loader.onDidLoadObjects = ^(NSArray *objects)
            space.team = nil;
            for (QBUser *user in objects)
            
                [space addTeamObject:user];
            

        ;
    ];

也就是说,我根据返回的对象数组手动添加了空格->用户链接。

这是正确的做法吗?它似乎工作正常,但我担心我错过了关于 RestKit 自动执行操作的技巧。

相关文件的返回 XML 如下所示

<users type="array">
<user>
<id>aPrimaryKey</id>
<login>loginName</login>
<login_name warning="deprecated">loginName</login_name>
<name>Real Name</name>
</user>

所以返回的文件中没有任何内容表明我试图链接到的空间:我在我请求的 URL 中传递了它,但返回的文档中没有关于它的任何内容,这就是我出现的原因使用这个基于块的解决方案。

对于所有 RestKit 用户,这看起来是一种可接受的形成多对多链接的方式吗?

【问题讨论】:

【参考方案1】:

如果有效,可以吗?

您可以考虑使用 Space 自定义 ManagedObject。让它回复RKObjectLoaderDelegate

然后,当您收到回复时,您可以从其内部触发loadAtResourcePath objectLoader:didLoadObject:(id)objectobjectLoader:didLoadObjectDictionary: 方法。

您还可以让您的 Space 类响应来自 User 的代表,然后将它们绑定到他们的空间?

这可能会更好,但这取决于您要达到的目标。总之值得深思。 :)

【讨论】:

是否可以让模型对象触发 Web 服务请求?这对我来说似乎有点违反 MVC。绝对值得考虑。您是否知道处理与 Core Data 的多对多关系的 RestKit 文档的任何示例或链接? 我知道你的意思。我开始使用 GetSpace 之类的类来处理 Web 服务工作,但是当我完成它时,我发现 Web 服务的东西在我正在处理的数据的超类中更好。所以我最终得到了一个超类 BasePostData,然后如果我为一个类做一些特别的事情(比如像你的例子那样在关系中链接),那么我可以在子类中做。我希望这是有道理的。 您知道处理与 Core Data 的多对多关系的 RestKit 文档的任何示例或链接吗? - 我假设您的意思是在一个 JSON 请求中使用它们之间的映射,不,并且不确定您将如何执行此操作。如果是单独的请求,我想你可以在代码中链接它们......但没有例子抱歉。 我不介意单独的请求——我更希望 RestKit 有一些你可以应用到请求中的东西来告诉它“这个请求获取的所有东西?像对待他们一样对待他们've got space=aSpaceID set",而不是必须在完成块中的代码中执行此操作。也许我只是期待更多的魔法。

以上是关于RestKit 与 Core Data 多对多:它有效,但我做得对吗?的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 多对多谓词(再次)

使用 Swift 和 Core Data 的多对多附加数据

RestKit 多对多关系在连接表中保存新行,在主表中保存空值

NSTokenField 代表 Core Data 的多对多关系

RestKit 创建多对多关系

在“多对多关系”环境中将图片保存在 Core Data 中