查看没有时间之前出现耗时的操作
我实现了我的应用程序这个指标:只要https://github.com/vincechan/SwiftLoadingIndicator右后查看没有时间之前出现耗时的操作
这种负载微调来前,我希望它旋转的时候,为我的操作持续。
在我的操作中,我在图像上做了一些工作,然后将它们展示给用户,但每次点击“运行操作”按钮后,应用程序冻结几秒钟,更新视图并显示覆盖图微调。 我已经试过异步分派是这样的:
@IBAction func manipulateImage(sender: AnyObject) {
dispatch_async(dispatch_get_main_queue(), {
LoadingOverlayView.show()
});
if let beginImage = CIImage(image: self.imageView.image!) {
var outputImage = OutputImage(sourceImage: beginImage)
//apply CIFilters:
outputImage.applyFilter(FilterType.Grayscale)
outputImage.applyFilter(FilterType.Sepia)
outputImage.applyFilter(FilterType.Vignette)
outputImage.applyFilter(FilterType.Shadow)
let cgimg = self.imageContext.createCGImage(outputImage, fromRect: outputImage.extent)
self.imageView.image = UIImage(CGImage: cgimg)
LoadingOverlayView.hide()
}
,但它不工作。同样正常的方法调用,没有异步调度,行为完全相同。
您可能在UI线程上运行此代码。如果是这样,您可以按如下方式将操作调度到后台队列:
// we're already on the UI thread, so dispatch to a background queue
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// do your background operations ...
if let beginImage = CIImage(image: self.imageView.image!) {
var outputImage = OutputImage(sourceImage: beginImage)
//apply CIFilters:
outputImage.applyFilter(FilterType.Grayscale)
outputImage.applyFilter(FilterType.Sepia)
outputImage.applyFilter(FilterType.Vignette)
outputImage.applyFilter(FilterType.Shadow)
let cgimg = self.imageContext.createCGImage(outputImage, fromRect: outputImage.extent)
// make sure to dispatch UI function back to main queue!
dispatch_async(dispatch_get_main_queue(), {
self.imageView.image = UIImage(CGImage: cgimg)
LoadingOverlayView.hide()
});
}
});
// we're already on the UI thread, so show the overlay now
LoadingOverlayView.show()
这几乎是我想要的,但有这个日志:'这个应用程序正在从后台线程修改自动布局引擎,这可能导致引擎损坏和奇怪的崩溃。这将在未来的版本中引发异常。“我想我们应该摆脱它。 – user2462794
您被警告在后台线程上执行UI操作时,请注意此警告。请参阅代码中关于将UI操作分派回主队列的说明(例如,您的覆盖隐藏操作)。 – CSmith
您将需要显示比此更多的代码。这段代码在哪里被调用?你在哪里隐藏'LoadingOverlayView'? – AdamPro13
@ AdamPro13我已经更新了这篇文章,里面有很多东西。 – user2462794
你在主线程上运行它吗? – Wain