У меня есть класс Poster
, который отправляет уведомления через NSNotificationCenter
. У меня есть два разных наблюдателя: ObserverSuperclass
и ObserverSubclass
. ObserverSuperclass
- это суперкласс ObserverSubclass
. Я хотел бы, чтобы каждый класс реагировал по-разному на уведомление.Блокировка NSNotificationCenter с подклассами?
Согласно NSHipster, я должен использовать современный блок-интерфейс api: addObserverForName:object:queue:usingBlock:
.
В способе инициализации ObserverSubclass
мне нужно удалить суперкласс в качестве наблюдателя. Поскольку я использую основанный на блоках API, мне нужно ссылаться на возвращаемое значение addObserverForName:object:queue:usingBlock:
- «непрозрачный объект для работы в качестве наблюдателя». Поэтому я пишу следующий код:
В ObserverSuperclass.h
@property (nonatomic, strong) id observer;
В ObserverSuperclass.m
self.observer = [NSNotificationCenter defaultCenter] addObserverForName:@"Help!" object:nil queue:nil usingBlock:^{old block}];
В ObserverSubclass.m
[[NSNotificationCenter defaultCenter] removeObserver:self.observer name:@"Help!" object:nil];
self.observer = [NSNotificationCenter defaultCenter] addObserverForName:@"Help!" object:nil queue:nil usingBlock:^{new block}];
Действительно ли это лучший способ сделать это? Я не уверен, что имеет смысл использовать основанный на блоках API.
Вы можете реализовать метод, который возвращает блок обработчика. Затем вы можете просто переопределить этот метод в подклассе или просто использовать API на основе селектора – Paulw11
Зачем вам нужно удалить суперкласс в качестве наблюдателя? Разве вы не хотите, чтобы этот блок выполнялся вообще? – Roberto