2014-01-28 5 views
3

Я хочу динамически добавлять код в блок-переменную или объединять или конкатенировать блок с другим блоком. Это возможно?Можете ли вы добавить код в переменную блока Objective-C?

+0

Возможный дубликат [Что происходит с блоком во время компиляции, и могу ли я создать его во время выполнения?] (Http://stackoverflow.com/questions/16323089/what-happens-to-a-block-at- compile-time-and-can-i-create-one-at-runtime) – Caleb

ответ

3

Возможно ли это?

Нет, но вы можете создать коллекцию блоков и выполнить их последовательно.

+0

Не могли бы вы привести пример назначения блока коллекции? Нужно ли быть c-массивом, поскольку блок не является объектом? Или вы можете каким-то образом обернуть блок внутри другого объекта для хранения в NSMutableArray? – sean

+1

Не требуется упаковка - [блок - объект Objective-C] (https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/Blocks/Articles/bxOverview.html#//apple_ref/doc/UID/TP40007502-СН3-SW2). Вы можете [хранить их в NSArray] (http://stackoverflow.com/q/7997666/643383) (или другой коллекции Obj-C), или вы можете создать другой блок, который принимает два или более блоков в качестве параметров и выполняет их один за другим, поскольку dasblinkenlight хорошо иллюстрирует. – Caleb

+0

Как узнать, когда блок с индексом n завершен, чтобы мы могли перейти на n + 1? – sean

4

Один из способов сделать это - создать блок, который называет блок «расширенным» перед выполнением собственных функций.

Например, рассмотрим пример ниже, который добавляет ведение журнала функциональные возможности для произвольного блока передается в него:

typedef void (^MyBlock)(int); 

-(MyBlock) expand:(MyBlock)nested { 
    return ^(int x) { 
     nested(x); 
     NSLog("The value of x = %d", x); 
    }; 
} 

Кумулятивный эффект вызова блока производимого expand: является то, что из вызова исходного блока, а затем операция из расширенного блока. Вы можете взять его дальше, чтобы создать appendBlock метод:

-(MyBlock) appendBlock:(MyBlock)second toBlock:(MyBlock)first { 
    return ^(int x) { 
     first(x); 
     second(x); 
    }; 
} 
1

Sure - просто создать новый блок, который делает использование оригинала в любой композиционном, как вы хотите. Если у вас есть block1 и block2, вы можете создать:

someCodeBefore = ^myBlockType(block1) { 
    someCode() 
    thatIWantBefore(); 
    block1(); 
    } 

    someCodeAfter = ^myBlockType(block1) { 
    block1(); 
    someCode() 
    thatIWantAfterBlock1(); 
    } 

    composedBlocks = ^myBlockType(block1, block2) { 
    block1(); 
    block2(); 
    } 

Просто убедитесь, что вы копируете блоки правильно.

+0

Это действительно не то же самое, что объединить/объединить блоки вместе. У вас все еще есть отдельные блоки, каждый со своим собственным состоянием, а не один блок с общим состоянием. – Caleb

+0

Но, поскольку блоки непрозрачны, что это значит «делить состояние»? Вы не могли увидеть ни одного из них, даже если бы он был общим. –

+0

Точно - вы можете использовать блоки в комбинации, и у вас может быть один блок, содержащий другие блоки, но вы не можете * объединить * два блока в один блок (это то, что я понял, о котором спрашивали) , – Caleb

Смежные вопросы