Ios 当主线程被阻塞时,UIKit如何绘制动画UIActivityIndicator?

Ios 当主线程被阻塞时,UIKit如何绘制动画UIActivityIndicator?,ios,multithreading,uikit,drawing,objective-c-blocks,Ios,Multithreading,Uikit,Drawing,Objective C Blocks,考虑下面的代码。运行此操作时,活动指示器会出现并设置动画,同时“测试”会重复记录到控制台。为什么? 我希望活动指示器出现在屏幕上,但无法设置动画,因为“测试”块在下一次重画活动指示器之前在主队列上执行,并且该块永远不会完成执行 UIKit是否将活动指示器从主线程上拔下 - (void)viewDidLoad { [super viewDidLoad]; UIActivityIndicatorView *v = [[UIActivityIndicatorView alloc] initWi

考虑下面的代码。运行此操作时,活动指示器会出现并设置动画,同时“测试”会重复记录到控制台。为什么?

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

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");
    }
  });
}

核心动画编程指南

声明:

因为它操作静态位图,基于图层的图形 与更传统的基于视图的图形有显著不同 技术。使用基于视图的图形时,经常会更改视图本身 导致调用视图的drawRect:方法来重画内容 使用新参数。但是这样画画很昂贵,因为 这是使用主线程上的CPU完成的。核心动画避免 只要有可能,通过在中操作缓存的位图,就可以节省开支 硬件实现相同或相似的效果


并非所有的绘图都会在主线程上进行。

当然,任何动画都只是由苹果在另一个线程上作为计时器来实现的,它只是连续(比如说,20hz或其他)告诉用户界面改变帧。