我需要同步在主队列上调度一个块.我不知道我目前是在主线程上运行还是不运行.天真的解决方案看起来像这样:
dispatch_sync(dispatch_get_main_queue(), block);
Run Code Online (Sandbox Code Playgroud)
但是如果我当前在主队列上运行的块中,则此调用会产生死锁.(同步调度等待块完成,但块甚至没有开始运行,因为我们正在等待当前块完成.)
显而易见的下一步是检查当前队列:
if (dispatch_get_current_queue() == dispatch_get_main_queue()) {
block();
} else {
dispatch_sync(dispatch_get_main_queue(), block);
}
Run Code Online (Sandbox Code Playgroud)
这有效,但很难看.在我至少将它隐藏在一些自定义功能之前,是不是有更好的解决方案来解决这个问题?我强调我不能异步调度块 - 应用程序处于异步调度块将"执行得太晚"的情况.
我有一个方法应该支持从任何队列调用,并应该期望.它在后台线程本身运行一些代码,然后在它返回一个值的块参数时使用dispatch_get_main_queue.我不希望它强制它进入主队列,如果不是它进入方法时.有没有办法获得指向当前调度队列的指针?
我正在使用IOS 5中的xmppframework开发一个聊天应用程序; 它完美地运作.但是我将我的xcode更新为4.5.1,将ios5更新为IOS 6,将我的mac OS更新为10.7.5,由于弃用问题,该项目无法正常工作.我用ios 6中的新方法替换了所有方法,除了这一个:
dispatch_get_current_queue()
Run Code Online (Sandbox Code Playgroud)
如何在IOS 6中替换此方法?
我已经看到了一些相关问题,但似乎没有人回答这个问题.我想写一个在后台做一些工作的方法.我需要这个方法在用于原始方法调用的同一个线程/队列上调用完成回调.
- (void)someMethod:(void (^)(BOOL result))completionHandler {
dispatch_queue_t current_queue = // ???
// some setup code here
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
BOOL ok = // some result
// do some long running processing here
dispatch_async(current_queue, ^{
completionHandler(ok);
});
});
Run Code Online (Sandbox Code Playgroud)
这里需要什么神奇的咒语才能在与调用相同的队列或线程上调用完成处理程序sameMethod
?我不想假设主线程.当然dispatch_get_current_queue
不会被使用.
Apple为什么弃用dispatch_get_current_queue?这次电话有什么不安全之处?
现在dispatch_get_current_queue
在iOS 6 中已弃用,如何dispatch_after
在当前队列中执行某些操作?
如何检查dispatch_queue_t变量之间的相等性?
dispatch_queue_t currentQueue = dispatch_get_current_queue();
dispatch_queue_t mainQueue = dispatch_get_main_queue();
if (currentQueue == mainQueue) {
}
Run Code Online (Sandbox Code Playgroud)
来自文档:
typedef struct dispatch_queue_s *dispatch_queue_t;
Run Code Online (Sandbox Code Playgroud)
我不确定,但这是否意味着它是一个指向dispatch_queue_s结构的指针?
由于我无法检查指针的相等性,我不知道如何检查dispatch_queue_t是否与另一个相同?