我有一个生成要由用户打印的图像的类。这些图像是使用 QuartzCore(和一些 UIKit 元素)创建的,需要在主线程上运行。
在生成图像时用户可见的视图中,我有一个进度条。此视图是执行打印的类的委托,打印机在视图上调用一个方法来更新进度条。问题是,在打印机完成之前,进度条不会明显更新,因为打印机阻塞了主线程。我无法将进度条移出主线程,因为所有 UI 更新都必须在主线程上完成。
我对多线程相当陌生;我还有其他选择吗,或者我必须使用活动指示器或类似的东西吗?
我有一个生成要由用户打印的图像的类。这些图像是使用 QuartzCore(和一些 UIKit 元素)创建的,需要在主线程上运行。
在生成图像时用户可见的视图中,我有一个进度条。此视图是执行打印的类的委托,打印机在视图上调用一个方法来更新进度条。问题是,在打印机完成之前,进度条不会明显更新,因为打印机阻塞了主线程。我无法将进度条移出主线程,因为所有 UI 更新都必须在主线程上完成。
我对多线程相当陌生;我还有其他选择吗,或者我必须使用活动指示器或类似的东西吗?
更新您的代码,以便在后台线程上完成图像创建。这应该是安全的。
然后你可以调用主线程来更新进度条。
你可以使用GCD , Raywenderlich 教程
- (void)generatePage
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
/*
Here you can generate page and update progress
For example:
*/
[self updateProgress:10.0f];
sleep(1000);
[self updateProgress:20.0f];
sleep(3000);
[self updateProgress:100.0f];
});
}
- (void)updateProgress:(float)progress
{
dispatch_async(dispatch_get_main_queue(), ^{
progressView.progress = progress;
});
}