【发布时间】:2015-05-27 20:20:25
【问题描述】:
在使用 Core Data 和 Magical Record 工作了一段时间后,我正在开发一个 iOS 应用程序并出现错误:
error: NULL _cd_rawData 但对象没有变成故障
在这个项目之前我并不了解 Core Data,事实证明我非常天真地认为我可以使用 Magical Record 而不用担心并发性,因为我没有专门针对托管上下文的任何想法/工作主线程和后台线程。
在大量阅读有关 Core Data Managed Object Contexts 和 Magical Record 之后,我了解到:
- NSManagedObjects 不是线程安全的。
- NSManagedObjectId 是线程安全的。
- 我可以使用:
Entity *localEntity = [entity MR_inContext:localContext]的 Magical Record 在后台线程上下文中处理实体。 - 我应该使用 Magical Record 的
saveWithBlock:completion:和saveWithBlockAndWait:方法来获取托管上下文以用于后台线程。
关于我的申请的一些信息:
- 我正在使用最新版本的 Magical Record 2.2。
- 我有一个后端服务器,我的应用程序经常与它通信。
- 它们的通信类似于 Whatsapp,因为它使用后台线程与服务器通信并在成功响应后更新托管对象。
- 我使用 DataModel 对象包装模型,这些对象将托管对象保存在数组中,以便快速引用 UI/后台使用。
现在 - 我的问题是:
- 我应该只从 UI 线程获取吗?我可以将托管对象保存在 DataModel 对象中吗?
- 如何从后台线程创建新实体并在 DataModel 对象中使用新创建的实体?
- 是否有我应该使用的最佳设计方案?特别是在向服务器发送请求并获得响应时,我是否应该创建一个新的托管上下文并在整个线程的活动中使用它?
如果一切都清楚,请告诉我。如果没有,我会尝试增加清晰度。
任何帮助或指导将不胜感激。
谢谢!
【问题讨论】:
标签: ios multithreading magicalrecord