当主线程被阻止时,UIKit如何绘制动画UIActivityIndi​​cator?

时间:2014-09-28 19:31:02

标签: ios multithreading uikit drawing objective-c-blocks

请考虑以下代码。运行此操作时,将显示活动指示器并设置动画,同时将“test”重复记录到控制台。为什么呢?

我希望活动指示符出现在屏幕上但无法设置动画,因为在下次重新绘制活动指示符之前在主队列上执行“test”块,并且该块永远不会完成执行。

UIKit是否将活动指示器从主线程中拉出来?

- (void)viewDidLoad {
  [super viewDidLoad];
  UIActivityIndicatorView *v = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
  [self.view addSubview:v];
  v.center = self.view.center;
  [v startAnimating];
  dispatch_async(dispatch_get_main_queue(), ^{
    while (1) {
      NSLog(@"test");
    }
  });
}

1 个答案:

答案 0 :(得分:1)

核心动画编程指南

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreAnimation_guide/CoreAnimation_guide.pdf

说明:

  

因为它操纵静态位图,基于图层的绘图   与传统的基于视图的绘画有很大不同   技术。使用基于视图的绘图,通常会对视图本身进行更改   导致调用视图的drawRect:方法重绘内容   使用新参数。但是以这种方式画画是昂贵的,因为   它是在主线程上使用CPU完成的。核心动画避免了   尽可能通过操纵缓存的位图来获得此费用   硬件实现相同或类似的效果。

并非所有绘图都会在主线程上发生。