如何直接调用dispatch_block_t?

Xav*_*hay 2 macos objective-c grand-central-dispatch automatic-ref-counting

我正在尝试更新XCode 6.1/Yosemite的一些代码.它有点奇怪,因为它是一个宏,但基本上它看起来像:

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

这导致编译问题.我已经在我的预处理器设置中设置了OS_OBJECT_USE_OBJC=0每个GCD指南,因为现在我对代码的现代化不感兴趣.

首先是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);
Run Code Online (Sandbox Code Playgroud)

但现在我收到一个新错误: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

Kaz*_*oto 6

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.
Run Code Online (Sandbox Code Playgroud)

dispatch_block_t应该是以下内容dispatch/object.h.

typedef void (^dispatch_block_t)(void);
Run Code Online (Sandbox Code Playgroud)

但是这些错误消息说的dispatch_block_t是相同的void *.你输入了dispatch_block_t自己而不是包含Foundation/Foundation.h或者dispatch/dispatch.h?您最好dispatch_block_t在代码中搜索typedef.