Как напечатать значение в цикле после некоторой задержки в swift

#swift #loops #dispatch-async

#swift #циклы #отправка-асинхронная

Вопрос:

я хочу напечатать свои значения в цикле после задержки в 5 секунд, вот как я пытаюсь это сделать

 let count = 1...10
for calls in count{
let seconds = 5
DispatchQueue.main.asyncAfter(deadline: .now()   .seconds(seconds), execute: {
print(calls)      
})
}
  

Но он ожидает 5 секунд только в первый раз и печатает все значения сразу.
Возможно, есть другой способ вызывать функцию много раз после задержки времени, пожалуйста, порекомендуйте

вот как я пытаюсь с таймером

     var seconds = 10
var timer = Timer()
override func viewDidLoad() {
    super.viewDidLoad()
    let count = 1...10
    for number in count{
        timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.counter), userInfo: nil, repeats: true)
            print(number)
    }
    
}
@objc func counter(){
    seconds -= 1
    if (seconds == 0){
        print("User Location")
    }
}
  

}

Комментарии:

1. почему бы вместо этого не использовать таймер?

2. @jawadAli та же проблема проверьте код, который я редактирую

3. Смотрите мой ответ. Вы на полпути (вы избавились от Dispatch.queue и используете таймер. Но вы действительно не хотите помещать таймер внутри вашего цикла — это наоборот. Вместо этого пусть таймер будет циклом.

Ответ №1:

Две части критических замечаний. Например, не используйте цикл — он выполняется немедленно. Во-вторых, используйте потоковую обработку, в этом нет необходимости. Используйте Timer вместо:

 class ViewController: UIViewController {
    
    var timer = Timer()
    var iterations = 0

    override func viewDidLoad() {
        super.viewDidLoad()
        timer = Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(printTime), userInfo: nil, repeats: true)
    }
    @objc func printTime() {
        print(Date())
        iterations  = 1
        if iterations == 5 {
            timer.invalidate()
        }
    }

}
  

Это вывод:

 2020-08-15 18:08:38  0000
2020-08-15 18:08:43  0000
2020-08-15 18:08:48  0000
2020-08-15 18:08:53  0000
2020-08-15 18:08:58  0000
  

После 5 итераций вы аннулируете время его отключения.

Комментарии:

1. как насчет sleep() ? вы бы порекомендовали это?

2. Я не уверен, без дополнительной информации. На самом деле я не вижу причин для print чего-либо внутри цикла, а тем более для его выполнения по времени. (В любом случае, не в готовом приложении.) Что вы действительно хотите сделать?