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 关系延迟加载?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Alamofire 在 UITableview 中延迟加载 API 请求