我使用一张大图片(2000x2000,500kb)作为我 iPad 应用程序中大多数视图控制器的背景图像。
问题是应用程序似乎在第一次使用这样的图像加载子 ViewController 时冻结在父 ViewController 上(后来由于缓存我假设它更快)。
我会在一个单独的线程中加载它,并在加载时显示一些指示器,但是我知道所有与 UI 相关的操作都应该在主线程上完成。
有没有办法可以改善用户体验,所以应用程序似乎不会冻结大约。2秒?(在我的情况下,平铺图像不是一种选择)
我使用一张大图片(2000x2000,500kb)作为我 iPad 应用程序中大多数视图控制器的背景图像。
问题是应用程序似乎在第一次使用这样的图像加载子 ViewController 时冻结在父 ViewController 上(后来由于缓存我假设它更快)。
我会在一个单独的线程中加载它,并在加载时显示一些指示器,但是我知道所有与 UI 相关的操作都应该在主线程上完成。
有没有办法可以改善用户体验,所以应用程序似乎不会冻结大约。2秒?(在我的情况下,平铺图像不是一种选择)
UIKit 的所有操作都应该在主线程上完成是错误的!只有绘制的操作应该在主线程上执行。在单独的线程中加载 UIImage 并在此之后将其交给主线程是完全节省的。但是我不认为加载需要那么长时间。我认为这可能是需要时间的绘图。
但是:由于 aUIActivityIndicatorView
在它自己的线程中运行(与所有 CoreAnimation 动画一样),它会保持动画,即使在添加指示器后阻塞主线程也是如此。尝试这个:
UIActivityIndicatorView* activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
[activityIndicator startAnimating];
[self addSubview:activityIndicator];
dispatch_async(dispatch_get_main_queue(), ^{
UIImage* image = [UIImage imageNamed:@"MyImage"];
UIImageView* imageView = [[UIImageView alloc] initWithImage:image];
[self addSubview:imageView];
[activityIndicator removeFromSuperview];
});
这将启动UIActivityIndicator
并开始在下一个运行循环循环中加载图像。添加图像后,它会删除超级视图。也许您必须再次调度活动指示器的移除,以便 UIKit 有时间绘制图像。在这种情况下,但[activityIndicator removeFromSuperview]
在另一个dispatch_async
到主队列的第一个块内。