Так что блоки и mikeash , опять же, закончили тем, что спасли мой день!
Одна вещь, которую я пропустил в своем первоначальном вопросе, состояла в том, что я хотел бы, чтобы эта парадигма была безопасна для категории, что означало отсутствие иваров или свойств в качестве флагов. Вот что я в итоге сделал:
#import <objc/runtime.h>
static void *AHandlerKey;
static void *BHandlerKey;
- (void)startWatchingForA
{
// initialize `void (^aBlock)(NSNotification *)` block
id AHandler = [[NSNotificationCenter defaultCenter] addObserverForName: SomeNotificationName
object: nil
queue: nil
usingBlock: aBlock];
objc_setAssociatedObject(self, AHandlerKey, AHandler, OBC_ASSOCIATION_RETAIN);
}
- (void)stopWatchingForA
{
id AHandler = objc_getAssociatedObject(self, AHandlerKey);
[[NSNotificationCenter defaultCenter] removeObserver: AHandler
name: SomeNotificationName
object: nil];
}
- (void)startWatchingForB
{
// initialize `void (^bBlock)(NSNotification *)` block
id BHandler = [[NSNotificationCenter defaultCenter] addObserverForName: SomeNotificationName
object: nil
queue: nil
usingBlock: bBlock];
objc_setAssociatedObject(self, BHandlerKey, BHandler, OBC_ASSOCIATION_RETAIN);
}
- (void)stopWatchingForB
{
id BHandler = objc_getAssociatedObject(self, BHandlerKey);
[[NSNotificationCenter defaultCenter] removeObserver: BHandler
name: SomeNotificationName
object: nil];
}
Таким образом, AHandler
получает уведомления, тогда как aBlock
выполняется, и BHandler
/ bBlock
также. Когда я удаляю AHandler
в качестве наблюдателя, BHandler
не затрагивается, и наоборот. Отлично!
Обновление: Большое спасибо Джошу Касвеллу, который предложил использовать ассоциацию объектов!