主线程中的di​​spatch_get_main_queue()

B.S*_*.S. 25 multithreading objective-c nsthread grand-central-dispatch

我有一些方法可以在某些情况下改变UI.

例如:

-(void) myMethod {

  if(someExpressionIsTrue) {
    // make some UI changes
    // ...
    // show actionSheet for example
  }
}
Run Code Online (Sandbox Code Playgroud)

有时从某些人那里myMethod调用.mainThreadother thread

这就是为什么我希望这些UI更改可以肯定地执行mainThread.

我改变了myMethod这种方式所需的部分:

if(someExpressionIsTrue) {
     dispatch_async(dispatch_get_main_queue(), ^{
        // make some UI changes
        // ...
        // show actionSheet for example
      });
}
Run Code Online (Sandbox Code Playgroud)

所以问题:

  • dispatch_async(dispatch_get_main_queue() 在主线程中调用是否安全且良好的解决方案?它会影响性能吗?
  • 这个问题可以用另一种更好的方式解决吗?我知道我可以检查它是否是一个使用[NSThread isMainThread]方法的主线程,并且dispatch_async仅在其他线程的情况下调用,但它将使我再创建一个方法或阻止这些UI更新.

Abi*_*ern 37

在主队列中从主队列中添加异步块没有问题,它所做的就是稍后在运行循环中运行该方法.

你绝对不想做的是调用dispatch_sync从主队列中向主队列添加一个块,因为你最终会锁定自己.


Zhe*_*ing 6

如果您在主线程中调用dispatch_async,请不要担心.iOS会将块放入队列并在主线程中执行块.

  • 呃......这就是"这些东西是如何工作的". (7认同)
  • 你能提供任何参考吗? (2认同)