具有非托管属性的 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 中的returnsObjectsAsFaultsawakeFromFetch 应该在获取对象时调用。简单地访问一个属性不应该触发它。不知道发生了什么。 @TechZen:谢谢,setReturnsObjectsAsFaults 有效。它仍然不理想。我希望在访问派生(图像)属性时触发故障,但不确定最干净的方法是什么。 【参考方案1】:

按照 TechZen 的建议,我现在执行 fetch 请求,并将 returnsObjectsAsFaults 设置为 NO。每次获取对象时从缓存中提取所有数据当然不理想,但在我的情况下,我总是立即使用数据,所以这是可以接受的。

【讨论】:

如果我正确理解了您的设计,在访问 image 属性之前不加载 UIImage 将获得更好的性能。将加载图像的代码放入自定义的image 属性访问器中。这将确保图像始终可用,但会阻止您在内存中拥有实际上不需要的图像。 @TechZen:我可以这样做(尽管实际上它不会有什么不同),但这要求对象在image 属性时不是错误被访问,因为一旦进入访问器,似乎我不能再触发错误了。【参考方案2】:

您似乎想做两件相互矛盾的事情,您希望主实体保持故障但能够访问其属性。你不能这样做。根据定义,故障没有属性/属性,因为它只是对象图中的占位符。如果您希望您的主对象保持故障,您应该将 UIImage 移动到它自己的实体并将其链接到主对象。然后,您应该能够遍历对象图以获取 UIImage,而无需触发加载主对象的错误占位符。

【讨论】:

嗯,不是真的。但我想使用awakeFromFetch 从数据中创建图像,并且根据我所了解的一切,这正是awakeFromFetch 应该做的事情。但是访问该属性(仅存在于类中,而不存在于实体中)不会引发错误。我需要它来触发,因为没有 imageData 我无法创建派生图像。

以上是关于具有非托管属性的 awakeFromFetch的主要内容,如果未能解决你的问题,请参考以下文章

使用 COM 互操作从非托管 C++ 访问 c# 属性

C# 托管非托管代码

具有非托管成员的托管类

LoadLibraryW 调用在 IIS 上挂起

将具有枚举成员的非托管结构编组到 c#

WCF 服务调用具有复杂数据类型的非托管 c++ dll