Хотя я согласен с тем, что переопределение automaticallyNotifiesObserversForKey
, похоже, работает, но я лично полностью отказываюсь от свойств isExecuting
и isFinished
и вместо этого определяю свойства executing
и finished
, которые, как предполагает Кевин, более последовательны с современными соглашениями:
@property (nonatomic, readwrite, getter = isExecuting) BOOL executing;
@property (nonatomic, readwrite, getter = isFinished) BOOL finished;
Затем я пишу пользовательские установщики для этих двух свойств, которые делают необходимые уведомления isExecuting
и isFinished
:
- (void)setExecuting:(BOOL)executing
{
[self willChangeValueForKey:@"isExecuting"];
_executing = executing;
[self didChangeValueForKey:@"isExecuting"];
}
- (void)setFinished:(BOOL)finished
{
[self willChangeValueForKey:@"isFinished"];
_finished = finished;
[self didChangeValueForKey:@"isFinished"];
}
Это дает:
- более привычное
BOOL
объявление собственности;
- пользовательские сеттеры удовлетворяют странным уведомлениям, которые требуются
NSOperation
; и
- Теперь я могу просто использовать сеттеры
executing
и finished
во всей моей реализации операции, не засоряя мой код уведомлениями.
Должен признаться, мне нравится элегантность переопределения automaticallyNotifiesObserversForKey
, но я просто беспокоюсь о непредвиденных последствиях.
Обратите внимание: если вы делаете это в iOS 8 или Yosemite, вам также придется явно синтезировать эти свойства в вашем @implementation
:
@synthesize finished = _finished;
@synthesize executing = _executing;