CoreData 关系延迟加载?

Posted

技术标签:

【中文标题】CoreData 关系延迟加载?【英文标题】:CoreData Relationships Lazy Load? 【发布时间】:2010-09-13 01:08:31 【问题描述】:

如果我有一个名为“Book”的 CoreData 实体,它与另一个实体(“Bookmark”)具有一对一的关系,我是否需要同时插入一个“Book”实例和一个将“书签”添加到托管对象上下文中,并手动分配关系?

如果我执行以下代码来实例化 'Book' 的实例...

Book *book = [NSEntityDescription insertNewObjectForEntityForName:@"Book" inManagedObjectContext:managedObjectContext];

我是否可以执行以下代码来检索其书签而不将“书签”的实例插入到相同的托管对象上下文中?

book.bookmark;

CoreData 会为我分配一个新的“书签”实例吗?

在你让我试试这个并亲自看看之前:我有。我要么做错了,要么我打算实例化'Book'和'Bookmark'的两个实例并手动分配关系。在我的测试中,该关系具有“可选”未勾选,但未附加任何内容。在 'book' 实例上调用 getter 'bookmark' 时,我收到 'nil'。

我希望能够使用上面的代码,因为它允许我的控制器对象处理托管对象上下文,而我的模型对象可以完全忽略它。根据我对 CoreData 的阅读,这似乎是预期的实现。如果我错了,请纠正我。

【问题讨论】:

【参考方案1】:

如果Book 对象始终需要Bookmark 关系,那么您可以为bookmark 属性编写自定义getter 方法,该方法将在需要时插入bookmark 对象。

Xcode 会为你生成最适合你的方法。在数据模型编辑器中,按住 Control 键单击 bookmark 并选择 Copy Objective-C 2.0 Implementation to the clipboard。然后像这样调整:

- (NSManagedObject *)bookmark 

    id tmpObject;

    [self willAccessValueForKey:@"bookmark"];
    tmpObject = [self primitiveBookmark];
    [self didAccessValueForKey:@"bookmark"];

    if (tmpObject==nil)
        BookmarkMO *newBookmark=[NSEntityDescription entityForName:@"Bookmark" inManagedObjectContext:self.managedObjectContext];
        newBookmark.book=self; //triggers kvo relationship assignment
        tmpObject=newBookmark;
    
    return tmpObject;

【讨论】:

这对我不起作用。当我粘贴实现时,它只是粘贴“@dynamic myAttribute”。我正在使用 XCode 4.5,它没有“将 Objective-C 2.0 实现复制到剪贴板”菜单项,但它确实有一个“粘贴关系实现”,我认为这是正确的机制。有什么想法吗? 我认为这应该是 [NSEntityDescription insertNewObjectForEntityForName: @"Bookmark" ...]【参考方案2】:

根据我的经验,您必须先创建两个实体并自己创建关系。

这样的东西应该是你需要的:

Bookmark *bookmark = [NSEntityDescription insertNewObjectForEntityForName:@"Bookmark" inManagedObjectContext:managedObjectContext];
[book setBookmark: bookmark];  

【讨论】:

+1 感谢您的回复。我希望 CoreData 会为我处理它,但手动创建它也一样好。 :)

以上是关于CoreData 关系延迟加载?的主要内容,如果未能解决你的问题,请参考以下文章

UITableView - 延迟加载联系人图片

从延迟加载的模型中获取 activerecord 关系

如何在 NHibernate 中插入后启用延迟加载关系

使用 Alamofire 在 UITableview 中延迟加载 API 请求

异步 SQLalchemy:访问急切加载的空关系会触发新的延迟加载,引发错误

MyBatis应用开发(16)延迟加载之概念