核心数据 - 管理上下文

时间:2014-06-26 12:44:15

标签: ios core-data

我希望你们的人对我写的所有内容发表评论,因为我想知道自己是否走上正轨。所以,在这里。

  1. 当你有多个视图控制器执行不同任务的应用程序时,你会说使用多个托管对象上下文是正确的方法吗?我发现在视图控制器中使用单例上下文和子上下文可以解决问题,当您只想保存上下文的一部分时,即创建小的本地上下文并在将其保存到存储之前将所有内容推送到主上下文。 例如,我使用一个VC创建了一些对象,这个VC现在是上下文的一部分,但我没有按下保存新对象。但是,随着新对象,我去了其他VC并保存了其他东西。问题是,作为相同上下文的一部分,您可以保存整个上下文状态。在这种情况下,我必须分开上下文。
  2. 我认为使用上下文层次结构会将对一个上下文所做的更改传播到父级,然后其他子级会在再次获取时看到已编辑的数据,但事实并非如此。如果我想查看更改,我必须使用refreshObject:mergeChanges: YES作为参数。另外,我必须再次获取以检查新记录。有更好的解决方案吗? 例如,我根据我的设置加载VC,转到其他VC,更改设置并保存。现在,当我回来时,我想在viewWillAppear中:根据设置中的更改获取更改并更改GUI。但是,问题是,当我获取设置时,我得到相同的数据,我认为是因为缓存?但是在这种情况下父母背景有什么意义呢?
  3. 那么,如果你不得不一直提取和刷新,真的需要多个上下文吗? 与上述类似,为什么在不传播更改的情况下链接上下文?
  4. 重置上下文 - 何时是重置上下文的好时机?如果我使用单例上下文,一切都存储在其中,所以一段时间后,它可能会占用大量内存,对吧?那么,从这个角度来看,我是否真的想在上下文中使用单例?例如,我在一些tableView中有一个对象列表。因为在层次结构中我一直持有它,因为它是导航堆栈的一部分,我应该一直保存所有对象,还是处理它们并在我到达VC时再次获取它们?我的意思是,如果对象属于不同的上下文,我就无法做很多事情。我必须通过他们的ID获取对象才能将它们与未连接的上下文一起使用,对吧?

1 个答案:

答案 0 :(得分:0)

所以我不是CoreData专家,但我会尝试解决每个问题。你应该在Core Data上阅读这个伟大的article,即关于让它传播更改的Parent-Child上下文。

1)我认为通常的做法是随时保存您的上下文 - 您希望在一个VC上更改数据,转到下一个,更改更多数据并保存它的用例是什么,但忽略数据在以前?如果您只是想放弃更改,那么[managedObjectContext rollback]应该是您取消重置上下文状态时所要求的内容。

2)我假设你已经按照文章中的描述将你的VC设置在父子层次结构中 - 如果是这样,那么确保你保存了孩子和父母的上下文。孩子将更改推送到父级,然后保存父级实际上将更改保存在coredata中。在viewWillAppear上,当您轮询CoreData时,应该存在更改。

3)请参阅上面链接的精彩文章,以保存子上下文和父上下文:)

4)为了释放内存,我没有必要重置上下文。通常从我所看到的是人们确实使用在appload上实例化的单例(然后是父子在后台更新数据)。其中一个大SO点可能更好地描述内存会发生什么,但是如果你真的担心你可以将VC的上下文指针指向ViewDidDisappear上的单例,那么在viewWillAppear上重新实例化它重新加载对象。