如何在主队列或线程上调度带参数的块

时间:2011-09-09 15:43:45

标签: objective-c concurrency grand-central-dispatch objective-c-blocks

块很棒。因为我以为我理解了它们,所以我想提高赌注并在更复杂的情况下使用它们。现在这些街区正在踢我的脸,我正试图把它分解成可理解的部分。

假设我在此伪代码中有两个块,方便地命名为blockAblockB。第一个是一个简单的无参数块,它只打印一行。第二个采用xyz类型的一个参数id

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

运行blockA时,我会执行类似blockA();的操作,或者当我想要定位主队列/线程时,我使用dispatch_sync_async方法:< / p>

dispatch_sync(dispatch_get_main_queue(), blockA);

但是虽然我知道如何使用blockB这样的参数调度blockB(someObject);,但我无法弄清楚如何在主线程上显式调用那个。我正在寻找类似下一行的东西,但当然这是这是如何工作的:

    dispatch_sync(dispatch_get_main_queue,blockB,someObject);

现在我已经尝试将该块包装在另一个块中,但说实话,它看起来并不正确,感觉它导致的问题多于它解决的问题。除了包装块以外,还有什么东西可以在主队列/线程上用一个或多个参数调度一个块吗?

2 个答案:

答案 0 :(得分:18)

不。在这种情况下,包装块正是您必须要做的。在代码中:

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

一开始看起来有点奇怪,但这种风格使调度API变得如此简单,并且自动保留捕获的变量使其成为可能。你遇到问题我有点惊讶。他们是什么?

答案 1 :(得分:0)

我也习惯了。老实说,我看不到更清洁/更好的东西:

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