显示等待视图,直到正在进行图像过滤
showing wait view till image-filtering in progress
大家好(我想这是我的第一个问题:)),
我是 Swift 和 iOS 编程的新手。我正在进行图像过滤,我正在尝试使用 UIActivityIndicatorView
等待过滤图像加载完毕。 activity 指标包含在另一个带有文本标签的视图中:"Filtering in Progress"。但是等待视图不会出现。
通过调试,我注意到执行一行代码后视图不会立即更新;视图在整个块执行后更新。因此,在这种情况下,以下代码不起作用:
showActivityView() //shows the view with text and spinner
filteredImageView.image = imageProcessor.clearFilters().addFilter(currentFilter).filter() //shows filtered image on image view
hideActivityView() //hides the view with text and spinner
这不起作用,因为我猜,整个视图在 hideActivityView() 完成后更新。关于如何以干净的方式实现它的任何想法。
另外,如果有人知道的话,最好有一些相关的参考资料。我正在努力寻找自己,但到目前为止还没有运气。
非常感谢。
您应该在另一个线程中进行过滤。您可以使用 Grand Central Dispatch (tutorial here) 来完成此操作。
您的代码将类似于以下内容:
showActivityView() //shows the view with text and spinner
var image: UIImage?
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), {
image = imageProcessor.clearFilters().addFilter(currentFilter).filter() //shows filtered image on image view
dispatch_async(dispatch_get_mein_queue(), {
filteredImageView.image = image!
hideActivityView() //hides the view with text and spinner
}
}
非常感谢您的提示。我今天读了很多关于这个概念的文章。所以,我先创建一个队列:
var waitQueue: dispatch_queue_t = dispatch_queue_create("waiter", nil)
然后将所有过滤作业放入队列.. 如 mad_manny 的解决方案所述。
let activityView = showActivityView("Filter in Progress..")
dispatch_async(waitQueue) {
self.currentFilter = filter.changeIntensity((filter.MIN_INTENSITY+filter.MAX_INTENSITY)/2)
self.filteredImage = self.imageProcessor.clearFilters().addFilter(self.currentFilter).filter()
dispatch_async(dispatch_get_main_queue()) {
self.filteredImageView.image = self.filteredImage
self.hideActivityView(activityView)
self.showFilteredImage()
}
}
大家好(我想这是我的第一个问题:)),
我是 Swift 和 iOS 编程的新手。我正在进行图像过滤,我正在尝试使用 UIActivityIndicatorView
等待过滤图像加载完毕。 activity 指标包含在另一个带有文本标签的视图中:"Filtering in Progress"。但是等待视图不会出现。
通过调试,我注意到执行一行代码后视图不会立即更新;视图在整个块执行后更新。因此,在这种情况下,以下代码不起作用:
showActivityView() //shows the view with text and spinner
filteredImageView.image = imageProcessor.clearFilters().addFilter(currentFilter).filter() //shows filtered image on image view
hideActivityView() //hides the view with text and spinner
这不起作用,因为我猜,整个视图在 hideActivityView() 完成后更新。关于如何以干净的方式实现它的任何想法。
另外,如果有人知道的话,最好有一些相关的参考资料。我正在努力寻找自己,但到目前为止还没有运气。 非常感谢。
您应该在另一个线程中进行过滤。您可以使用 Grand Central Dispatch (tutorial here) 来完成此操作。 您的代码将类似于以下内容:
showActivityView() //shows the view with text and spinner
var image: UIImage?
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), {
image = imageProcessor.clearFilters().addFilter(currentFilter).filter() //shows filtered image on image view
dispatch_async(dispatch_get_mein_queue(), {
filteredImageView.image = image!
hideActivityView() //hides the view with text and spinner
}
}
非常感谢您的提示。我今天读了很多关于这个概念的文章。所以,我先创建一个队列:
var waitQueue: dispatch_queue_t = dispatch_queue_create("waiter", nil)
然后将所有过滤作业放入队列.. 如 mad_manny 的解决方案所述。
let activityView = showActivityView("Filter in Progress..")
dispatch_async(waitQueue) {
self.currentFilter = filter.changeIntensity((filter.MIN_INTENSITY+filter.MAX_INTENSITY)/2)
self.filteredImage = self.imageProcessor.clearFilters().addFilter(self.currentFilter).filter()
dispatch_async(dispatch_get_main_queue()) {
self.filteredImageView.image = self.filteredImage
self.hideActivityView(activityView)
self.showFilteredImage()
}
}