将 Mantle 与核心数据一起使用 - NSSet 和 NSArray

Posted

技术标签:

【中文标题】将 Mantle 与核心数据一起使用 - NSSet 和 NSArray【英文标题】:Using Mantle with Core Data - NSSet and NSArray 【发布时间】:2014-01-10 10:41:04 【问题描述】:

我需要你的帮助,因为我无法理解这件事。我在 ios 中使用 Mantle 和 CoreData。

我定义了如下所示的关系:

发表 1:N 评论

当我从我的 REST 服务中提取数据时,我创建了一个包含 NSMutableArray 评论的 Mantle Object Post。这完美无缺。

然后我将它存储在 Core Data 中,这就是我不知道我是否做对了的地方。

[MTLManagedObjectAdapter managedObjectFromModel:post insertingIntoContext:[self getManagedObjectContext] error:&error];

所以我这样做是为了将我的帖子对象存储到核心数据中。核心数据模型有一个名为“post_has_cmets”的关系,它是一种级联的一对多关系。因此,在对象 Post 上,我有“posts_has_cmets”-> 级联,在我的对象“Comment”上,我与“Nullify”有一对一的关系。

Afaik,Core Data 将其视为 NSSet。不过,我要输入的是 NSMutableArray,因为 Mantle 会处理这个问题(至少快速查看它的源代码告诉我的是这样)。

不幸的是,当我使用

从 Core Data 取回对象时
Post* post = [MTLManagedObjectAdapter modelOfClass:Post.class fromManagedObject:[[self fetchedResultsController] objectAtIndexPath:indexPath] error:nil];

post 对象上的属性 cmets 是一个空的 NSSet,我在事先插入该东西时遇到了一些错误。我得到的错误:

Core Data: annotation: repairing missing delete propagation for to-many relationship post_has_comments on object [...]

我被卡住了 - 也许我在这里遗漏了一些重要的东西?

我的 Post 类实现了以下静态方法:

+ (NSDictionary *)managedObjectKeysByPropertyKey 
return @
         @"post_id" : @"id",
         @"comments" : @"post_has_comments"
         ;


+ (NSDictionary *)JSONKeyPathsByPropertyKey 
    return @
             @"post_id" : @"id",
             ;


+ (NSDictionary *)relationshipModelClassesByPropertyKey 
    return @
             @"comments" : IHComment.class
             ;

【问题讨论】:

你解决了吗? 您可以查看我对已接受答案的回复 - 但是,我不知道这在今天是如何适用的,因为这是两年前的事了。 【参考方案1】:

一个简单的解决方法是编写您自己的属性设置器方法,如果设置的值为NSSet,则将其转换为NSMutableArray,然后再将其设置回您的属性ivar

例如:

- (void)setComments:(NSMutableArray *)comments 
    if ([comments isKindOfClass:NSSet.class]) 
        _comments = [NSMutableArray arrayWithArray:[((NSSet *)comments) allObjects]];
     else 
        _comments = comments;
    

我自己做过很多次,效果很好!

【讨论】:

【参考方案2】:

来自 Mantle 文档:

Mantle 可以轻松为您的 Cocoa 或 Cocoa Touch 应用程序编写简单的模型层。

这只是一个未经证实的说法。查看框架,我看不到证据在哪里。您应该获取您的对象,并使用 Apple 的 API 将它们插入到 Core Data 中。

Post *cdPost = [NSEntityDescription insertNewObjectForEntityForName:@"Post"
   inManagedObjectContext:self.managedObjectContext];
// configure the cdPost object with the data from the web service
for (id commentObject in commentArrayFromPostObject) 
   Comment *cdComment = 
       [NSEntityDescription insertNewObjectForEntityForName:@"Comment"
       inManagedObjectContext:self.managedObjectContext];
   // configure the cdComment object with the data from the web service
   cdComment.post = cdPost;

仅此而已。

【讨论】:

嗯,答案并不完全正确,但为我指明了正确的方向。我发现虽然 Mantle 确实支持 CoreData,但它在 CoreData 中存在反转关系的问题和警告。一个解决方案是自己简单地管理它,或者在进一步改进之前避免使用 Mantle。此外,我在服务器端遇到了一个非常讨厌的错误,并且 Mantle 与 CoreData 的结合非常糟糕地绊倒了它,没有给出任何例外。 :( 我再次通读了我的代码 - 只是出于兴趣:究竟什么不完全正确? 代码完全没问题。 “你应该得到你的对象,并使用 Apple 的 API 将它们插入到 Core Data 中。” Mantle 提供了自己的接口来做到这一点:[MTLManagedObjectAdapter managedObjectFromModel:car insertingIntoContext:self.masterManagedObjectContext error:NULL]; 这使得从 Core Data 中获取 Mantle 对象成为可能,这很有用,因为这些对象可以通过 Mantle 轻松序列化为 JSON。 好的,我明白了。但是你没有考虑到我之前的论点。根据这些陈述,在将我的建议标记为“不完全正确”之前,您首先必须提供关于上面引用的“简单”部分的证据。

以上是关于将 Mantle 与核心数据一起使用 - NSSet 和 NSArray的主要内容,如果未能解决你的问题,请参考以下文章

如何将 undoManager 与核心数据实体一起使用

将 Picker 与核心数据一起使用

如何将 NSOutlineView 与多个核心数据实体作为组一起使用

Mantle - 映射嵌套数据结构

可以将“self”与 NSSortDescriptor 一起使用来按对象本身而不是对象的属性进行排序? (核心数据/NSFetchedResultsController)

与核心数据一起使用时预览崩溃