Постоянная проверка ответа в Swift

#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
    }
}