相关疑难解决方法(0)

如何在没有死锁的情况下同步调度主队列?

我需要同步在主队列上调度一个块.我不知道我目前是在主线程上运行还是不运行.天真的解决方案看起来像这样:

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)

这有效,但很难看.在我至少将它隐藏在一些自定义功能之前,是不是有更好的解决方案来解决这个问题?我强调我不能异步调度块 - 应用程序处于异步调度块将"执行得太晚"的情况.

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

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

获取当前的调度队列?

我有一个方法应该支持从任何队列调用,并应该期望.它在后台线程本身运行一些代码,然后在它返回一个值的块参数时使用dispatch_get_main_queue.我不希望它强制它进入主队列,如果不是它进入方法时.有没有办法获得指向当前调度队列的指针?

iphone objective-c dispatch grand-central-dispatch ios

45
推荐指数
6
解决办法
4万
查看次数

如何在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万
查看次数

dispatch_async并在原始队列上调用完成处理程序

我已经看到了一些相关问题,但似乎没有人回答这个问题.我想写一个在后台做一些工作的方法.我需要这个方法在用于原始方法调用的同一个线程/队列上调用完成回调.

- (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不会被使用.

objective-c grand-central-dispatch ios

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

Apple为什么弃用dispatch_get_current_queue?

Apple为什么弃用dispatch_get_current_queue?这次电话有什么不安全之处?

objective-c grand-central-dispatch

9
推荐指数
1
解决办法
5064
查看次数

如何在当前队列中调度_after?

现在dispatch_get_current_queue在iOS 6 中已弃用,如何dispatch_after在当前队列中执行某些操作?

objective-c grand-central-dispatch ios ios6

8
推荐指数
1
解决办法
3276
查看次数

在dispatch_queue_t上检查是否相等

如何检查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是否与另一个相同?

cocoa cocoa-touch nsthread grand-central-dispatch

3
推荐指数
1
解决办法
5093
查看次数