Подтвердить что ты не робот

Передайте блок методу С++ из объективного C

У меня есть вспомогательный класс С++, который я использую с objective-C. Я хотел бы передать классу С++ блок из контроллера представления (обратный вызов), так что когда он будет выполнен, я нахожусь в основном потоке и могу обновить интерфейс. В настоящее время у меня есть аналогичная система, работающая с указателями функций и performSelector при вызове функции. Я хотел бы пример того, как настроить переменную С++ и как передать ей блок objective-C и вызвать его из класса С++.

Если это невозможно, можете ли вы придумать другое/лучшее решение?

4b9b3361

Ответ 1

Значит, вы не совсем знакомы с синтаксисом блока? Если это так, вот краткий пример, который, надеюсь, имеет смысл, если вы уже знакомы с указателями функций (синтаксис более или менее одинаковый, но с использованием ^ для объявления одного [создание замыкания конечно, разные]).

Вероятно, вы хотите настроить typedef для типов блоков, чтобы сохранить повторение одного и того же объекта снова и снова, но я включил примеры как для использования typedef, так и для ввода самого типа блока в параметры.

#import <Cocoa/Cocoa.h>

// do a typedef for the block
typedef void (^ABlock)(int x, int y);

class Receiver
{
public:
    // block in parameters using typedef
    void doSomething(ABlock block) {
        block(5, 10);
    }

    // block in parameters not using typedef
    void doSomethingToo(void (^block)(int x, int y)) {
        block(5, 10);
    }
};


int main (int argc, char const *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    Receiver rcv;
    // pass a block
    rcv.doSomething(^(int x, int y) { NSLog(@"%d %d", x, y); });
    rcv.doSomethingToo(^(int x, int y) { NSLog(@"%d %d", x, y); });

    [pool drain];
    return 0;
}

Ответ 2

См. Использование блока как аргумента функции. При объявлении вашего метода используйте синтаксис, подобный приведенному ниже, чтобы объявить аргумент блока:

void theFunction(blockReturnType (^argumentName)(blockArgumentTypes));

Блочный вызов выглядит как вызов функции, поэтому реализация theFunction выше, которая просто вызывает блок и возвращает его результат, будет выглядеть так:

int theFunction(int anArgument, int (^theBlock)(int)) {
    return theBlock(anArgument);
}

Этот синтаксис будет работать для C, С++ и Objective-C.