我正在尝试研究如何将资源注入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]。
思想?
答案 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>