相关疑难解决方法(0)

对于iOS 6中的完成块,dispatch_get_current_queue()的替代方法是什么?

我有一个接受块和完成块的方法.第一个块应该在后台运行,而完成块应该在调用方法的任何队列中运行.

对于后者我总是使用dispatch_get_current_queue(),但似乎它在iOS 6或更高版本中已被弃用.我应该用什么呢?

cocoa-touch objective-c grand-central-dispatch objective-c-blocks ios6

98
推荐指数
5
解决办法
5万
查看次数

如何在不使用dispatch_get_current_queue()的情况下验证我是否在给定的GCD队列上运行?

最近,我需要一个可用于保证在特定串行调度队列上同步执行给定块的函数.有可能从已经在该队列上运行的东西调用这个共享函数,所以我需要检查这种情况,以防止从同步调度到同一队列的死锁.

我使用如下代码来执行此操作:

void runSynchronouslyOnVideoProcessingQueue(void (^block)(void))
{
    dispatch_queue_t videoProcessingQueue = [GPUImageOpenGLESContext sharedOpenGLESQueue];

    if (dispatch_get_current_queue() == videoProcessingQueue)
    {
        block();
    }
    else
    {
        dispatch_sync(videoProcessingQueue, block);
    }
}
Run Code Online (Sandbox Code Playgroud)

此函数依赖于使用此函数dispatch_get_current_queue()来确定此函数正在运行的队列的标识,并将其与目标队列进行比较.如果匹配,它知道只运行块内联而不调度到该队列,因为该函数已在其上运行.

我听说过是否适当使用dispatch_get_current_queue()这样的比较是有争议的,我在标题中看到了这个措辞:

建议仅用于调试和记录目的:

代码不得对返回的队列做任何假设,除非它是全局队列之一或代码本身创建的队列.如果该队列不是dispatch_get_current_queue()返回的队列,则代码不得假设同步执行到队列是安全的死锁.

此外,在iOS 6.0中(但尚未针对Mountain Lion),GCD标题现在将此功能标记为已弃用.

听起来我不应该以这种方式使用这个功能,但我不确定我应该在它的位置使用什么.对于像上面那样针对主队列的函数,我可以使用[NSThread isMainThread],但是如何检查我是否在我的一个自定义串行队列上运行以便防止死锁?

macos grand-central-dispatch ios objective-c-blocks

39
推荐指数
1
解决办法
6075
查看次数

如何在iphone中将已弃用的方法dispatch_get_current_queue()从ios5替换为ios6?

我正在使用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中替换此方法?

iphone grand-central-dispatch ios

38
推荐指数
1
解决办法
2万
查看次数