Запустить анонимный блок в определенном фоновом потоке - PullRequest
8 голосов
/ 05 декабря 2011

На первый взгляд это кажется простым вопросом, но я просто не могу понять, как запустить анонимный блок в определенной фоновой нити, т.е. я ищу блоки, эквивалентные -performSelector:onThread:withObject:waitUntilDone:.

Связанный: Возможно ли связать очередь отправки с определенным фоновым потоком, так же как основная очередь связана с основным потоком приложения?

Изменить Уточнил, что я хочу запуститьанонимный блок

Ответы [ 3 ]

6 голосов
/ 05 декабря 2011

Если я вас правильно понимаю, вы должны сделать это:

dispatch_queue_t thread = dispatch_queue_create("your dispatch name", NULL);
dispatch_async(analyze, ^{
    //code of your anonymous block
});
dispatch_release(thread);

Вы также можете написать некоторый метод, который будет принимать блок, но вы должны знать, какие параметры он будет содержать:

-(void)performBlock:(void (^)(SomeType par1, SomeType par2))block ToData:(Sometype)data;

Вы можете позвонить с анонимным блоком:

[something performBlock:^(SomeType par1, SomeType par2){
  //do your stuff
} ToData: data] 

И в методе вы можете вызвать свой блок как простую функцию C:

block(par1, par2);
6 голосов
/ 23 апреля 2012

Я недавно видел эту функцию RunOnThread() в Mike Ash's PLBlocksPlayground (zip-файл, см. BlocksAdditions.m):

void RunOnThread(NSThread *thread, BOOL wait, BasicBlock block)
{
    [[[block copy] autorelease] performSelector: @selector(my_callBlock) onThread: thread withObject: nil waitUntilDone: wait];
}

Это то, что я искал.

В PLBlocksPlayground есть множество других очень полезных утилит, связанных с блоками, большинство из которых мистер Эш объясняет в этом посте .

0 голосов
/ 05 декабря 2011

Блок - это функция. Вызывайте это так, как если бы вы вызывали любую другую функцию.

...