Предложение: не надо. Помимо всего прочего, он будет искажать номера строк при отладке.
Вы можете определить обычную функцию, которая будет делать то же самое, если хотите, что-то вроде
typedef void(^VoidBlock)();
void on_main(VoidBlock block) {
dispatch_async(dispatch_get_main_queue(), block);
}
Это имеет то преимущество, что вы не теряете номера строк для блока во время отладки. Я даже делал такие вещи, как
void on_main(VoidBlock block) {
if (dispatch_get_current_queue() == dispatch_get_main_queue()) {
block();
} else {
dispatch_sync(dispatch_get_main_queue(), block);
}
}
, который я могу вызвать из основной очереди или нет.
Вы действительно хотите избежать помещения блоков кода в аргументы макроса. Если вы делаете и должны отлаживать этот код, вы ненавидите себя. (Немного в щеке, но это действительно больно, если вам нужно отлаживать любой макрос, который расширяется до нескольких строк кода.)