查看没有时间之前出现耗时的操作

问题描述:

我实现了我的应用程序这个指标:只要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() 
} 

,但它不工作。同样正常的方法调用,没有异步调度,行为完全相同。

+1

您将需要显示比此更多的代码。这段代码在哪里被调用?你在哪里隐藏'LoadingOverlayView'? – AdamPro13

+0

@ AdamPro13我已经更新了这篇文章,里面有很多东西。 – user2462794

+0

你在主线程上运行它吗? – Wain

您可能在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() 
+0

这几乎是我想要的,但有这个日志:'这个应用程序正在从后台线程修改自动布局引擎,这可能导致引擎损坏和奇怪的崩溃。这将在未来的版本中引发异常。“我想我们应该摆脱它。 – user2462794

+0

您被警告在后台线程上执行UI操作时,请注意此警告。请参阅代码中关于将UI操作分派回主队列的说明(例如,您的覆盖隐藏操作)。 – CSmith