主线程中的di​​spatch_get_main_queue()

时间:2013-09-17 10:31:20

标签: objective-c multithreading grand-central-dispatch nsthread

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

例如:

-(void) myMethod {

  if(someExpressionIsTrue) {
    // make some UI changes
    // ...
    // show actionSheet for example
  }
}

有时myMethod来自某些mainThread来自other thread

这就是我希望在mainThread

中确实执行这些UI更改的原因

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

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

所以问题:

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

2 个答案:

答案 0 :(得分:37)

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

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

答案 1 :(得分:6)

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