Внедрение ресурсов в экземпляры подкласса NSManagedObject - PullRequest
0 голосов
/ 26 ноября 2011

Я пытаюсь выяснить, как внедрить ресурсы в экземпляры подкласса 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 ]

1 голос
/ 27 ноября 2011

awakeFromFetch / awakeFromInsert всегда будет вызываться. Вам придется подойти к нему с другой стороны - управляемый объект должен будет запросить экземпляр «services» у какого-то другого класса (я думаю, это будет метод класса) - что-то вроде этого в ваших методах awakeFrom *:

self.serviceProvider = [ServiceProvider getServiceProviderForObject:self];

Ваш класс ServiceProvider будет иметь всю информацию об управляемом объекте и сможет вернуть соответствующий экземпляр.

0 голосов
/ 17 декабря 2016

На мой взгляд, самый чистый способ сделать это - превратить grossAmountForUnitPrice: amount: в метод класса вашего класса TaxCalculatorService.

Затем можно вызвать [TaxCalculatorService grossAmountForUnitPrice:self.unitPrice quantity:units] без необходимости создания экземпляра.экземпляр класса taxCalculatorService.

Предполагается, что экземпляр TaxCalculatorService не создается с состоянием, которое влияет на возвращаемые значения, например, ставкой налога для конкретной локали или аналогичной.Если это так, вам, конечно, понадобится эта информация здесь, чтобы создать экземпляр экземпляра, который вы описываете, поэтому, если вам нужна эта дополнительная информация, вы можете просто передать ее в качестве дополнительного параметра в методе класса.

0 голосов
/ 26 ноября 2011

Кажется, вы не можете просто вызвать следующее?

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

Он определен как свойство с сохранением, поэтому ваш управляемый объект должен сохранять ссылку на него.Обратите внимание, что изменения, внесенные в управляемый объект, не будут сохраняться до тех пор, пока вы не вызовете сохранение в контексте, в котором находится объект

.
...