#ios #swift #nstimer
#iOS #swift #nstimer
Вопрос:
У меня есть логическая переменная, вызываемая flag
с начальным значением false
. На основе успешного процесса для него устанавливается значение true. Существует кнопка alert
, при нажатии на которую проверяется значение флага вместе с вращающимся изображением в пользовательском интерфейсе, если flag
значение true, то должно отображаться сообщение об успешном завершении. в противном случае он должен продолжать проверку ответа (десять раз в течение 5 секунд).
Это моя функциональность. Я использовал NStimer
для достижения этой цели. Вот фрагмент кода:
var timer = NSTimer()
var count = 10
var flag: Bool = false
@IBOutlet weak var alert: UIButton!
@IBAction func alertAction(sender: AnyObject) {
timer = NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: #selector(ViewController.prints), userInfo: nil, repeats: true)
}
func prints(){
if(count > 0)
{
if flag == false{
**Spinning Image**
count -= 1
} else {
count = 0
}
} else {
timer.invalidate()
}
}
Вращение изображения останавливается и продолжается каждые 5 секунд (в случае, если ответ занимает более 5 секунд). Я хочу непрерывно вращать изображение без перерыва. Может кто-нибудь, пожалуйста, помочь?
Заранее спасибо!
Комментарии:
1. вы должны вызвать
func prints()
свой ответ.
Ответ №1:
Опрос — самый отчаянный асинхронный шаблон и почти всегда ошибочный. Узнайте немного о наблюдении за значениями и шаблоне реагирования.
var flag = false {
didSet {
if flag {
// stop spinning
}
}
}
func alertAction() {
// start spinning
}
Ответ №2:
Насколько я понимаю, этот код будет делать то, что вы намереваетесь. Если вы используете UIActivityIndicator. Убедитесь, что вы запустили его там, где я запустил rotationAnimation, и остановите его при аннулировании вашего таймера.
Пример Swift 3
@IBOutlet weak var pin: UIImageView!
var timer: Timer?
var count: Int = 5
var flag: Bool {
return count == 0
}
@IBAction func buttonPressed(_ sender: AnyObject) {
let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation")
rotationAnimation.fromValue = 0
rotationAnimation.toValue = 2 * M_PI
rotationAnimation.duration = 0.6
rotationAnimation.isCumulative = true
rotationAnimation.repeatCount = Float.infinity
pin.layer.add(rotationAnimation, forKey: "rotate")
timer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(prints), userInfo: nil, repeats: true)
}
func prints() {
if flag {
pin.layer.removeAllAnimations()
timer?.invalidate()
} else {
count = count - 1
}
}