如何直接调用dispatch_block_t?

How to call dispatch_block_t directly?

我正在尝试为 XCode 6.1 / Yosemite 更新 some code。它有点奇怪,因为它是一个宏,但本质上它看起来像:

dispatch_block_t blk = ^{ [[self globalEventsHandler] someMethod self]; };
if([NSThread isMainThread]) blk();
else dispatch_async(dispatch_get_main_queue(), blk);

这会导致编译问题。我已经在我的预处理器设置中根据 GCD guide 设置了 OS_OBJECT_USE_OBJC=0,因为现在我对代码现代化不感兴趣。

第一个是Implicit conversion of block pointer type 'void (^)(void)' to C pointer type 'dispatch_block_t' (aka 'void *') requires a bridged cast。我可以接受建议的修复并得到:

dispatch_block_t blk = (__bridge dispatch_block_t)^{ [[self globalEventsHandler] someMethod self]; };
if([NSThread isMainThread]) blk();
else dispatch_async(dispatch_get_main_queue(), blk);

但现在我收到一个新错误:Called object type 'dispatch_block_t' (aka 'void *') is not a function or function pointer。我被卡住了。

问题:

  1. 现在有办法直接调用dispatch_block_t吗?我在一些较旧的博客文章中找到了原始代码模式,所以我怀疑它很常见。
  2. __bridge 是正确的做法吗?似乎还有其他与 dispatch_retain 和朋友相关的选项可能合适。
  3. 我觉得我在这里遗漏了一个基本概念,这很有可能是因为我对 OSX 开发经验不足。

对于奖励积分:如何在不禁用 OS_OBJECT_USE_OBJC 的情况下使它工作?

该代码片段完全适用于 Xcode 6.1 和 OS X SDK 10.10。但是,这些编译错误信息很奇怪。

Implicit conversion of block pointer type 'void (^)(void)' to C pointer type 'dispatch_block_t' (aka 'void *') requires a bridged cast

Called object type 'dispatch_block_t' (aka 'void *') is not a function or function pointer.

dispatch_block_t应该是dispatch/object.h.

下面的
typedef void (^dispatch_block_t)(void);

但是这些错误消息说 dispatch_block_tvoid * 相同。您是否自己键入了 dispatch_block_t 而不是包含 Foundation/Foundation.hdispatch/dispatch.h?您最好在代码中搜索 dispatch_block_t typedef。