将资源注入NSManagedObject子类实例

时间:2011-11-26 13:34:08

标签: objective-c core-data nsmanagedobject nsmanagedobjectcontext

我正在尝试研究如何将资源注入NSManagedObject子类实例,但找不到合理的方法。

简单地说,我有一个对象代表一个实体的行为方法所需的服务。此服务需要在运行时可用。

在Plain-Old-Objective-C-Object中,我只是将此对象作为构造函数参数传递,或者在构造之后通过属性设置它。类似于需要多少个对象并使用委托。

但是,awakeFromInsert和awakeFromFetch显然不带任何参数,也无法在任何地方找到挂钩到NSManagedObjectContext以配置初始化后的NSManagedObjects。

有人有解决方案吗?

作为一个完全做作的例子:

@interface ProductEntity : NSManagedObject

@property (nonatomic, retain) NSNumber *unitPrice;
@property (nonatomic, retain) MyTaxCalculatorService *taxCalculatorService;

- (void)grossPriceForUnits:(NSUInteger)units;

@end

@implementation ProductEntity

@dynamic unitPrice;
@synthesize taxCalculatorService

- (void)grossPriceForUnits:(NSUInteger)units
{
   return [self.taxCalculatorService grossAmountForUnitPrice:self.unitPrice quantity:units];
}

@end

忽略这是否是计算总价格的最佳方式(这是一个人为的例子),我如何将taxCalculatorService实例纳入ProductEntity?我无法覆盖init,我无法在任何地方找到我可以一直调用[entity setTaxCalculatorService:service]。

思想?

3 个答案:

答案 0 :(得分:1)

总是会调用awakeFromFetch / awakeFromInsert。您将不得不从另一个方向接近它 - 托管对象必须请求"服务"来自其他一些类的实例(我认为这将是一个类方法) - 在你的awakeFrom *方法中是这样的:

self.serviceProvider = [ServiceProvider getServiceProviderForObject:self];

您的ServiceProvider类将拥有有关托管对象的所有信息,并可以返回相应的实例。

答案 1 :(得分:0)

看起来如此,你不能只是打电话给以下人员吗?

myProductEntityInstance.taxCalculatorService = [[MyTaxCalculatorService alloc] init];

它被定义为具有retain的属性,因此您的托管对象应该保留对它的引用。请注意,在对实体所在的上下文中调用保存之前,您对托管对象所做的更改将不会持久进行

答案 2 :(得分:0)

在我看来,到目前为止,最简单的方法是将grossAmountForUnitPrice:quantity:转换为TaxCalculatorService类的Class方法。

然后,您可以调用[TaxCalculatorService grossAmountForUnitPrice:self.unitPrice quantity:units],而无需实例化taxCalculatorService类的实例。

这假设您的TaxCalculatorService未使用影响其返回值的状态进行实例化,例如特定区域设置或类似的税率。如果是,那么你当然需要这些信息来实例化你正在描述的实例,所以如果需要那些附加信息,你可以将其作为类方法的附加参数传递。 / p>