2010-08-27 138 views
4

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

我读过关于多线程的核心数据编程指南,我使用每个线程单独管理对象的背景和一个持久存储协调规划,似乎被苹果推荐。

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

我的问题涉及我需要做什么来支持这一点。核心数据编程的多线程部分表示,我可以通过传递对象ID在两个线程之间“传递”对象。我有点困惑,至于我需要做什么。这两个线程各自拥有自己获取的每个对象的副本吗?如果是这样,他们如何同步?你是否应该明确地断定你知道另一个线程已修改的对象以使它们重新加载?

比方说,我在主线程中使用对象和工作线程修改它。是否足以让工作线程通知主线程该对象已被修改,以便主线程可以错误地强制重载?还是会自动故障?或者,也许这整个情况是一个坏主意,会导致一个错误?

我想通过具有在目前正在使用的所有对象的主线程的字典实现这一点。当工作者线程修改一个,大概是因为它从网络获取了一个更新的版本,我打算让它指示主线程,如果主线程当前位于它正在使用的对象列表中,则主线程可能会错误对象。这听起来像一个好主意,还是甚至有必要?

+0

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/Concurrency.html – 2017-04-21 22:36:00

回答

3

几个关键点要记住:

  1. 只共享对象ID线程之间的
  2. 使用NSManagedObjectContextDidSave通知与的NSManagedObjectContext方法mergeChangesFromContextDidSaveNotification结合:或refreshObject:mergeChanges:
  3. 花一些时间写作代码解决合并错误(即重置对象并再次尝试合并等)

您似乎具有正确的基础知识,通常情况下,它遇到的问题是合并两个线程中已修改的对象。在这种情况下,您必须重置要合并的对象,将其与通知线程的更改合并,然后根据需要重新应用任何本地更改。有一对夫妇的API方法,可以帮助你在这种情况下:

  1. NSManagedObject#changedValues会给你所有的更改属性,您可以藏匿在合并后重新申请的字典。遍历它的键并调用NSManagedObject#setValue:forKey:重新应用这些值。
  2. 如前所述,NSManagedObjectContext#refreshObject:mergeChanges :,当知道线程没有触及任何相同的属性时,最好使用此方法。在某些情况下,这是由设计保证的(网络线程只更新时间戳等)。

最后,在一个封装的NSOperation你的处理代码将使它很容易控制你的线程本地管理对象上下文的对象生命周期以及你可能会嚼起来作为分析的结果,任何记忆。