【问题标题】:awakeFromFetch with non-managed property具有非托管属性的 awakeFromFetch
【发布时间】: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 有效。它仍然不理想。我希望在访问派生(图像)属性时触发故障,但不确定最干净的方法是什么。

标签: objective-c cocoa cocoa-touch core-data nsmanagedobject


【解决方案1】:

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

【讨论】:

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

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

【讨论】:

  • 嗯,不是真的。但我想使用awakeFromFetch 从数据中创建图像,并且根据我所了解的一切,这正是awakeFromFetch 应该做的事情。但是访问该属性(仅存在于类中,而不存在于实体中)不会引发错误。我需要它来触发,因为没有 imageData 我无法创建派生图像。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 2014-05-27
  • 2012-05-19
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多