我正在编写一个类,您可以在其中注册一个对象和一个要观察的属性。当属性被设置为非nil
- 时,将调用注册的回调选择器(如 target-action)。选择器可能有三个不同的签名,根据注册的类型调用正确的一个。
这很好用,但现在我想添加将块而不是选择器注册为“回调函数”的功能。是否可以找出提供的 Block 的函数签名并根据提供的 Block 的类型以不同的方式处理回调?
例如:
- (void)registerCallbackBlock:(id)block
{
if ([self isBlock:block] {
if ([self isMethodSignatureOne:block]) { /* */ }
else if ([self isMethodSignatureTwo:block]) { /* */ }
else { assert(false); } // bad Block signature
block_ = block; // assuming ARC code
}
else { assert(false); } // not a block
}
- (void)callBlock
{
if ([self isMethodSignatureOne:block_] {
block_(arg1_, arg2_); // needs casting?
}
else if ([self isMethodSignatureTwo:block_) {
block_(arg1_, arg2_, arg3_); // needs casting?
}
}
有任何想法吗?
我知道我可以使用特定typedef
的 'ed Block 参数创建不同的寄存器函数,但如果可能的话,我宁愿使用单个函数。