29

我有在某些情况下更改 UI 的方法。

例如:

-(void) myMethod {

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

有时myMethod被称为从mainThread有时从一些other thread

这就是为什么我希望这些 UI 更改在mainThread.

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 更新。
4

2 回答 2

39

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

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

于 2013-09-17T11:25:08.097 回答
6

不要担心你是否在主线程中调用 dispatch_async。iOS 会将块放入队列并在主线程中执行块。

于 2013-09-17T10:55:34.970 回答