NSManagedObject - 跨线程设置自定义实例变量
Posted
技术标签:
【中文标题】NSManagedObject - 跨线程设置自定义实例变量【英文标题】:NSManagedObject - setting custom instance variables across threads 【发布时间】:2014-04-28 03:22:41 【问题描述】:我有一个 NSManagedObject 类,我为其添加了一个自定义实例变量,方法是使其成为属性并使用 @synthesize(但不在核心数据模型中使用“瞬态”)。如果我设置值并稍后在同一个线程中读取它,这很好用;但是如果我在不同的线程中设置这个属性的值,它仍然会在主线程上显示 nil。
举个例子,想想这个:
@interface Person : NSManagedObject
@property (nonatomic, strong) UIImage *personImage; // unmodeled
如果我在后台线程中设置 personImage 对象,它在主线程上仍然是“nil”。
有没有办法解决这个问题,以便属性实际上跨线程存储值?
【问题讨论】:
【参考方案1】:没有办法“修复”它,因为它没有损坏。每个上下文(以及每个线程)都将有一个单独的NSManagedObject
实例。它们是内存中完全不同的对象,不会共享实例变量。您需要在每个实例中初始化该实例变量。
这就是awakeFromInsert
和awakeFromFetch
在每个上下文中触发的原因。它使您有机会初始化这些实例变量。
【讨论】:
谢谢。我想没有办法直接合并来自不同线程的数据,没有一些中间缓存来读/写 正确。如果您要存储图像,则应该有一个位于NSManagedObject
之外的缓存,您的 UI 可以访问该缓存并且您可以控制内存释放等。以上是关于NSManagedObject - 跨线程设置自定义实例变量的主要内容,如果未能解决你的问题,请参考以下文章
将 NSManagedObject 与另一个 NSManagedContext(多线程)中的“相同”NSManagedObject 合并
获取 NSManagedObject 实例的上下文是不是是线程安全的?