如何直接调用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
。我被卡住了。
问题:
- 现在有办法直接调用
dispatch_block_t
吗?我在一些较旧的博客文章中找到了原始代码模式,所以我怀疑它很常见。
__bridge
是正确的做法吗?似乎还有其他与 dispatch_retain
和朋友相关的选项可能合适。
- 我觉得我在这里遗漏了一个基本概念,这很有可能是因为我对 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_t
与 void *
相同。您是否自己键入了 dispatch_block_t
而不是包含 Foundation/Foundation.h
或 dispatch/dispatch.h
?您最好在代码中搜索 dispatch_block_t
typedef。
我正在尝试为 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
。我被卡住了。
问题:
- 现在有办法直接调用
dispatch_block_t
吗?我在一些较旧的博客文章中找到了原始代码模式,所以我怀疑它很常见。 __bridge
是正确的做法吗?似乎还有其他与dispatch_retain
和朋友相关的选项可能合适。- 我觉得我在这里遗漏了一个基本概念,这很有可能是因为我对 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_t
与 void *
相同。您是否自己键入了 dispatch_block_t
而不是包含 Foundation/Foundation.h
或 dispatch/dispatch.h
?您最好在代码中搜索 dispatch_block_t
typedef。