Это решение Blocks работает хорошо, как только вы ловите голову на том, что происходит. Я добавил результат BOOL, потому что хотел иметь возможность условно запустить один из нескольких дополнительных методов. Несколько советов, если вы пытаетесь реализовать это решение:
Во-первых, если вы еще не сталкивались с Extension / Categories, вы просто добавляете это в начало своего класса, ВНЕ существующего определения класса. Это будет публичное или частное расширение в зависимости от того, где вы его разместили.
@implementation NSObject (Extensions)
// add block-based execution of optional protocol messages
-(BOOL) performBlock:(void (^)(void))block ifRespondsTo:(SEL) aSelector
{
if ([self respondsToSelector:aSelector]) {
block();
return YES;
}
return NO;
}
@end
Во-вторых, вот как вы это называете из своего кода:
BOOL b = [(NSObject*)self.delegate performBlock:^{
// code to run if the protocol method is implemented
}
ifRespondsTo:@selector(Param1:Param2:ParamN:)];
Замените Param1: Param2: ParamN: именами каждого параметра для вашего метода протокола. Каждый должен заканчиваться двоеточием.
Так что если ваш метод протокола выглядит так:
-(void)dosomething:(id)blah withObj:(id)blah2 andWithObj(id)blah3;
последняя строка будет выглядеть так:
ifRespondsTo:@selector(dosomething:withObj:andWithObj:)];