块很棒。因为我以为我理解了它们,所以我想提高赌注并在更复杂的情况下使用它们。现在这些街区正在踢我的脸,我正试图把它分解成可理解的部分。
假设我在此伪代码中有两个块,方便地命名为blockA
和blockB
。第一个是一个简单的无参数块,它只打印一行。第二个采用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);
现在我已经尝试将该块包装在另一个块中,但说实话,它看起来并不正确,感觉它导致的问题多于它解决的问题。除了包装块以外,还有什么东西可以在主队列/线程上用一个或多个参数调度一个块吗?
答案 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);});