Как получить метаданные типа блока времени выполнения в Objective-c?

Я пишу класс, в котором вы регистрируете объект и свойство для наблюдения. Когда для свойства устанавливается значение, отличное от nil , вызывается зарегистрированный селектор обратного вызова (например, target-action). Селектор может иметь три разные сигнатуры, и правая вызывается в зависимости от того, какой тип был зарегистрирован.

Это работает нормально, но теперь я хочу добавить возможность регистрировать блок вместо селектора в качестве «функции обратного вызова». Можно ли узнать сигнатуру функции поставляемого блока и по-разному обрабатывать обратный вызов в зависимости от типа предоставленного блока?

Например:

- (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 аргументами блока, но я бы предпочел, если возможно, иметь одну функцию.

7
задан Josh Caswell 10 October 2011 в 20:00
поделиться