相关疑难解决方法(0)

为什么我们不能在当前队列上使用dispatch_sync?

我遇到了一个场景,我有一个委托回调,可能发生在主线程或另一个线程上,我不知道哪个直到运行时(使用StoreKit.framework).

我还需要在该回调中更新UI代码,这需要在函数执行之前发生,因此我最初的想法是拥有这样的函数:

-(void) someDelegateCallback:(id) sender
{
    dispatch_sync(dispatch_get_main_queue(), ^{
        // ui update code here
    });

    // code here that depends upon the UI getting updated
}
Run Code Online (Sandbox Code Playgroud)

当它在后台线程上执行时,它工作得很好.但是,当在主线程上执行时,程序陷入僵局.

这本身似乎对我有意思,如果我读的文档dispatch_sync正确的,那么我希望它只是执行彻底,不担心它安排到runloop块,如说在这里:

作为优化,此函数在可能的情况下调用当前线程上的块.

但是,这不是太大的交易,它只是意味着更多的打字,这导致我采用这种方法:

-(void) someDelegateCallBack:(id) sender
{
    dispatch_block_t onMain = ^{
        // update UI code here
    };

    if (dispatch_get_current_queue() == dispatch_get_main_queue())
       onMain();
    else
       dispatch_sync(dispatch_get_main_queue(), onMain);
}
Run Code Online (Sandbox Code Playgroud)

然而,这似乎有点倒退.这是制作GCD的一个错误,还是我在文档中遗漏了什么?

multithreading objective-c grand-central-dispatch objective-c-blocks

58
推荐指数
4
解决办法
3万
查看次数