【发布时间】:2012-12-09 02:26:12
【问题描述】:
问题:处理一堆数据的最佳方式是什么?只有一些对象应该保存到 coredata 中的磁盘?
这是应用程序/问题: 该应用程序将为用户提供在互联网上搜索不同项目的可能性。 搜索将返回许多将显示给用户的对象。 用户应该能够随时收藏这些对象中的任何一个。已收藏的对象应连接到当前登录的用户,并在应用退出后生效。
该应用将以 iOS6 为基础。
我一直在使用这些资源
- Apple's Core Data Programming Guide: Efficiently Importing Data
- Implementing Fast and Efficient Core Data Import on iOS 5
- iDeveloperTV CoreData performance course
我目前正在研究使用 3 种上下文的父/子方法:Master、Main 和 Confinement 上下文类型。
当前可能的解决方案:
- 在磁盘上执行保存的MasterContext(具有persistentStoreCoordinator)
- UI 使用的 MainContext(masterContext 的子级)
- BackgroundContext 处理来自搜索的新对象。 (mainContext 的子级)
因此,用户可以进行搜索,返回 100 个对象(在后台上下文中导入并保存到主上下文中)。 其中 2 个对象受到用户的青睐(在主上下文中)。该对象将被添加到用户并设置为“应该保存”。 (在保存时,对象将被推送到主上下文)
当我保存主上下文时,我不想将所有 100 个对象保存到磁盘。只是用户喜欢的两个对象。
所以我考虑在我保存 mastercontext 之前删除不应该保存到磁盘的对象。
- (void) mainContextHasSaved: (NSNotification *) notification {
NSLog(@"Lets save the master");
[_masterManagedObjectContext performBlock:^{
//Loop through all inserted object and check if they should be saved to disk
[self removeObjectThatShouldNotBeSavedToDisk];
NSError *error = nil;
BOOL saveSuccess = [_masterManagedObjectContext save:&error];
if(saveSuccess) {
//Do something
}
}];
}
但是在我理解之后,当在父上下文上执行保存时,所有更改都将传播给子级。然后我将释放除已存储的两个之外的所有对象。
那么有人知道如何解决这类问题吗?我可以在上面的例子中做些什么吗?或者我应该创建多个持久存储并在上下文之间移动对象?
感谢所有愿意提供帮助的人,如果需要更多信息,请询问:)
【问题讨论】:
-
为所有结果创建对象,然后删除不喜欢的对象。仅在将应用置于后台时保存。
-
另外,为什么不使用查询 favorited == NO 来删除要删除的项目?
-
但是如果用户正在查看搜索结果,请选择一些对象并关闭应用程序。我认为用户希望在后台打开应用程序时仍然拥有数据。
-
是的——但我的意思是不需要经常调用 save 。除非你害怕崩溃:)
标签: ios core-data nsmanagedobjectcontext