iPhone核心数据和多线程

时间:2010-08-27 04:11:05

标签: iphone multithreading core-data

我正在开发一个iPhone应用程序,它通过网络传输数据并保存核心数据对象中收到的数据,以便以后使用。目前。它在单个线程中正常工作,但我正在努力将数据传输机制转换为在单独的工作线程中运行。

我已经阅读了关于多线程的核心数据编程指南,并且我计划为每个线程和单个持久性存储协调器使用单独的托管对象上下文,这似乎是Apple推荐的。

应用程序的主线程永远不需要创建或删除核心数据对象,而是询问工作线程。它主要是读取对象并偶尔修改它们。它还会定期要求工作线程从网络中获取现有对象的新对象或更新。

我的问题涉及我需要做些什么来支持这一点。核心数据编程的多线程部分说我可以通过传递对象ID在两个线程之间“传递”对象。对于我需要做什么,我有点困惑。两个线程都有自己的每个对象的副本吗?如果是这样,他们是如何同步的?您是否应该明确地对其他线程已修改的对象进行故障以使其重新加载?

假设我在主线程中使用了一个对象,而工作线程会修改它。是否足以让工作线程通知主线程对象被修改,以便主线程可以对其进行故障以强制重新加载?或者它会自动出错吗?或者也许这整个场景都是一个坏主意,并会导致执行?

我正在考虑通过在当前正在使用的所有对象的主线程中使用字典来实现这一点。当工作线程修改一个时,可能是因为它从网络中获取了更新版本,我将让它发出主线程的信号,如果对象当前在其正在使用的对象列表中,则主线程可以使对象出错。这听起来是个好主意,还是必要的呢?

1 个答案:

答案 0 :(得分:3)

要记住的几个要点:

  1. 仅在线程之间共享对象ID
  2. 将NSManagedObjectContextDidSave通知与NSManagedObjectContext方法结合使用mergeChangesFromContextDidSaveNotification:或refreshObject:mergeChanges:
  3. 花一些时间编写代码来解决合并错误(即重置对象并再次尝试合并等)。
  4. 您似乎已经掌握了基础知识,通常在合并两个线程中已修改过的对象时会变得棘手。在这种情况下,您必须重置要合并的对象,将其与通知线程的更改合并,然后根据需要重新应用任何本地更改。在这种情况下,有几种API方法可以帮助您:

    1. NSManagedObject#changedValues将为您提供所有已更改属性的字典,您可以在合并后存储以重新应用这些属性。迭代它的键并调用NSManagedObject#setValue:forKey:重新应用值。
    2. 如前所述,NSManagedObjectContext#refreshObject:mergeChanges:,当您知道线程未触及任何相同属性时,最好使用此方法。在某些情况下,这是由设计保证的(网络线程只更新时间戳等)。
    3. 最后,将处理代码封装在NSOperation中将使得控制线程本地托管对象上下文的对象生命周期以及解析后可能咀嚼的任何内存变得非常容易。