具有非托管属性的 awakeFromFetch
Posted
技术标签:
【中文标题】具有非托管属性的 awakeFromFetch【英文标题】:awakeFromFetch with non-managed property 【发布时间】:2011-03-26 15:54:41 【问题描述】:我有一个 NSManagedObject 子类,在 NSData 属性 (imageData
) 中有一些图像数据,它会自动持久化。从网络加载数据后,我还设置了一个自定义 NSImage 属性 (image
),其中包含从数据创建的图像。
问题是,如果对象有问题,当我访问 image
属性时,awakeFromFetch
不会被调用,因为它不是由 Core Data 处理的。我当然可以覆盖image
访问器并确保已加载属性(通过访问imageData
),但如果有一种方法可以正常调用awakeFromFetch
,那就太好了。有什么建议吗?
【问题讨论】:
您可能想稍微扩展一下这个问题,因为它有点不清楚。awakeFromFetch
不会因为您访问属性而被调用。每当您将 fetchAsFaults
设置为 NO 时调用它。
@TechZen:据我所知,awakeFromFetch
会在我访问时调用,例如,imageData
属性。还是我错了?
@TechZen:fetchAsFaults
是什么?
对不起,我想不到,它是 NSFetchRequest 中的returnsObjectsAsFaults
。 awakeFromFetch
应该在获取对象时调用。简单地访问一个属性不应该触发它。不知道发生了什么。
@TechZen:谢谢,setReturnsObjectsAsFaults
有效。它仍然不理想。我希望在访问派生(图像)属性时触发故障,但不确定最干净的方法是什么。
【参考方案1】:
按照 TechZen 的建议,我现在执行 fetch 请求,并将 returnsObjectsAsFaults
设置为 NO
。每次获取对象时从缓存中提取所有数据当然不理想,但在我的情况下,我总是立即使用数据,所以这是可以接受的。
【讨论】:
如果我正确理解了您的设计,在访问image
属性之前不加载 UIImage 将获得更好的性能。将加载图像的代码放入自定义的image
属性访问器中。这将确保图像始终可用,但会阻止您在内存中拥有实际上不需要的图像。
@TechZen:我可以这样做(尽管实际上它不会有什么不同),但这要求对象在image
属性时不是错误被访问,因为一旦进入访问器,似乎我不能再触发错误了。【参考方案2】:
您似乎想做两件相互矛盾的事情,您希望主实体保持故障但能够访问其属性。你不能这样做。根据定义,故障没有属性/属性,因为它只是对象图中的占位符。如果您希望您的主对象保持故障,您应该将 UIImage 移动到它自己的实体并将其链接到主对象。然后,您应该能够遍历对象图以获取 UIImage,而无需触发加载主对象的错误占位符。
【讨论】:
嗯,不是真的。但我想使用awakeFromFetch
从数据中创建图像,并且根据我所了解的一切,这正是awakeFromFetch
应该做的事情。但是访问该属性(仅存在于类中,而不存在于实体中)不会引发错误。我需要它来触发,因为没有 imageData 我无法创建派生图像。以上是关于具有非托管属性的 awakeFromFetch的主要内容,如果未能解决你的问题,请参考以下文章