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

epo*_*gee 4 concurrency objective-c grand-central-dispatch objective-c-blocks

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

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

void (^blockA){ NSLog(@"Doing something"); };
void (^blockB)(id xyz){ [xyz doSomething]; };
Run Code Online (Sandbox Code Playgroud)

在运行时blockA,我会做类似的blockA();或当我想要定位主队列/线程时,我使用dispatch_sync_async方法:

dispatch_sync(dispatch_get_main_queue(), blockA);
Run Code Online (Sandbox Code Playgroud)

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

dispatch_sync(dispatch_get_main_queue,blockB,someObject);

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

kpe*_*yua 19

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

void (^block)(id someArg) = someBlock;
id object = someObject;
dispatch_async(dispatch_get_main_queue(), ^{
    block(someObject);
});
Run Code Online (Sandbox Code Playgroud)

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