Я использую for l oop в сочетании с DispatchQueue с asyn c, чтобы постепенно увеличивать громкость воспроизведения в течение 5 или 10 минут.
Как я это реализую сейчас это:
for i in (0...(numberOfSecondsToFadeOut*timesChangePerSecond)) {
DispatchQueue.main.asyncAfter(deadline: .now() + Double(i)/Double(timesChangePerSecond)) {
if self.activityHasEnded {
NSLog("Activity has ended") //This will keep on printing
} else {
let volumeSetTo = originalVolume - (reductionAmount)*Float(i)
self.setVolume(volumeSetTo)
}
}
if self.activityHasEnded {
break
}
}
Моя цель состоит в том, чтобы activityHasEnded
действовал как нарушитель. Проблема, как указано в комментарии, заключается в том, что, несмотря на использование break
, NSLog
будет продолжать печатать в течение каждого периода. Как лучше всего выйти из этого для l oop, использующего DispatchQueue.main.asyncAfter
?
Обновлено: как заметил Роб, имеет смысл использовать Timer
. Вот что я сделал:
self.fadeOutTimer = Timer.scheduledTimer(withTimeInterval: timerFrequency, repeats: true) { (timer) in
let currentVolume = self.getCurrentVolume()
if currentVolume > destinationVolume {
let volumeSetTo = currentVolume - reductionAmount
self.setVolume(volumeSetTo)
print ("Lowered volume to \(volumeSetTo)")
}
}
Когда таймер больше не нужен, я звоню self.fadeOutTimer?.invalidate()