核心数据数据在后台

时间:2016-01-20 23:32:38

标签: ios core-data fetch backend

我正在开发一个应用程序,它最初从后端服务获取一些数据,并使用核心数据存储在应用程序sqlite中。在应用程序使用期间,托管对象会经历许多更改。及时将数据与后端服务同步。

我尝试使用两个托管对象上下文,一个用于用户界面交互,另一个用于与后端同步,以便我可以合并上下文。但是UI使用的上下文并没有每次都保存到持久存储中,因此当我使用第二个上下文获取时,托管对象中存在不匹配。

其次,我尝试使用父子上下文。用于UI交互的父上下文和用于及时数据同步的子。但有时我看到UI永远被阻止。我已确保托管对象上的操作在相应的托管对象上下文的块中执行。

我的问题是,如何处理从服务收到的新数据并更新托管对象而不会阻止用户界面。

1 个答案:

答案 0 :(得分:1)

Here's a post that describes a few possible setups。我将总结一些要点和解决方案。

您的第二次尝试失败,因为您的UI(父)上下文仍然在主线程上执行存储I / O,这就是它阻塞的原因。

解决方案1 ​​ - 保持上下文的分离,就像您先尝试一样。

  

通过订阅NSManagedObjectContextDidSaveNotification并在另一个上下文中调用mergeChangesFromContextDidSaveNotification来实现上下文之间的更改传播。

所以你订阅私人服务上下文的通知;然后在UI上下文中调用-mergeChanges ...,这使它们保持同步并且非常快。

解决方案2 - 使您的UI上下文成为第三个私有队列上下文的子级。换句话说,您的堆栈是持久存储< - 新的私有上下文< - UI(主要队列)上下文< - 私有同步上下文。这会将您的磁盘I / O移动到后台,从而使您的UI保持响应。但是请注意,现在您还必须在UI上下文和新上下文中调用save来保持后台更改;加上这种方法比解决方案1慢