Как отправить блок с параметром в основную очередь или поток - PullRequest
4 голосов
/ 09 сентября 2011

Блоки потрясающие. Поскольку я думал, что понял их, я хотел повысить ставку и использовать их в немного более сложной ситуации. Теперь эти блоки бьют меня по лицу, и я пытаюсь разбить его на понятные кусочки.

Скажем, у меня есть два блока в этом псевдокоде, которые обычно называются blockA и blockB. Первый - это простой блок без параметров, и он просто печатает строку. Второй принимает один параметр xyz типа id:

void (^blockA){ NSLog(@"Doing something"); };
void (^blockB)(id xyz){ [xyz doSomething]; };

Когда я запускаю blockA, я бы делал что-то вроде blockA(); или когда я хочу нацелиться на главную очередь / поток, я использую метод dispatch_sync или _async:

dispatch_sync(dispatch_get_main_queue(), blockA);

Но хотя я знаю, как отправить blockB с параметром, подобным blockB(someObject);, я не могу понять, как явно вызвать его в главном потоке. Я искал что-то вроде следующей строки, но, конечно, это не , как это работает:

dispatch_sync (dispatch_get_main_queue, blockB, someObject);

Теперь я попытался обернуть блок в другой блок, но, честно говоря, это просто выглядит неправильно, и казалось, что это вызывает больше проблем, чем решает. Есть ли что-то кроме упаковки блоков для отправки одного блока с одним или несколькими параметрами в основной очереди / потоке?

Ответы [ 2 ]

18 голосов
/ 09 сентября 2011

Неа. Оберточные блоки это именно то, что вам нужно сделать в этом случае. В коде:

void (^block)(id someArg) = someBlock;
id object = someObject;
dispatch_async(dispatch_get_main_queue(), ^{
    block(someObject);
});

Поначалу это может показаться немного странным, но этот стиль делает API диспетчеризации намного проще, а автоматическое сохранение захваченных переменных делает это возможным. Я немного удивлен, что вы столкнулись с проблемами. Кем они были?

0 голосов
/ 09 сентября 2011

Я тоже привык к блокам. Честно говоря, я не вижу ничего чище / лучше, чем:

dispatch_async(dispatch_get_main_queue(), ^{blockb(someObj);});
...