我们的应用正在调用import Data.Ratio (Rational)
import Formatting
newtype Price = Price {getPrice :: Rational}
instance Show Price where
show (Price p) = formatToString (fixed 2) p
方法,该方法在刷新运行时显示refreshData()
。问题是刷新有时可能非常快,导致指示器出现时闪烁并快速连续消失。我们如何确保指标出现的时间最短?
换句话说,即使刷新很快完成,也要确保指示器显示至少两秒钟。
答案 0 :(得分:6)
添加实例变量以记录开始长时间运行任务时的开始时间,并计算任务完成后经过的时间。 (我们假设您将已用时间存储在名为elapsed
的{{1}}中。)
使用对DispatchQueue.main.asyncAfter()
的调用关闭活动指示符,如果长时间运行的任务至少需要2秒,则将其传递给.now()
的最后期限,如果是.now() + 2.0 - elapsed
则为var delay = 0.0
if elapsed < 2.0 {
delay = 2.0 - elapsed
}
DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
activityIndicator.stopAnimating()
activityIndicator.hidden = true
}
不到2秒钟。
这样的事情:
let delay = max(0.0, 2.0 - elapsed)
DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
activityIndicator.stopAnimating()
activityIndicator.hidden = true
}
结合Downgoat的建议,我们可以使代码更清晰,更易于理解:
{{1}}
答案 1 :(得分:0)
迅速> = 3.1
let delay = 2 // seconds
self.activityIndicator.startAnimating()
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(delay)) {
self.activityIndicator.stopAnimating()
self.activityIndicator.isHidden = true
}