Как запрограммировать задержку в Swift 3
в более ранних версиях Swift можно было создать задержку со следующим кодом:
let time = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), 4 * Int64(NSEC_PER_SEC))
dispatch_after(time, dispatch_get_main_queue()) {
//put your code which should be executed with a delay here
}
но теперь, в Swift 3, Xcode автоматически изменяет 6 разных вещей, но затем появляется следующая ошибка: "не удается преобразовать DispatchTime.now к ожидаемому значению dispatch_time_t ака UInt64."
как можно создать задержку перед запуском последовательности кода в Swift 3?
6 ответов:
после многих исследований, я, наконец, понял это.
DispatchQueue.main.asyncAfter(deadline: .now() + 2) { // change 2 to desired number of seconds // Your code with delay }это создает желаемый эффект "ожидания" в Swift 3 и Swift 4.
вдохновленный часть ответ.
мне нравится однострочная нотация для GCD, она более элегантна:
DispatchQueue.main.asyncAfter(deadline: .now() + 42.0) { // do stuff 42 seconds later }кроме того, в iOS 10 у нас есть новые методы таймера, например, инициализатор блока:
(поэтому замедленное действие может быть отменено)
let timer = Timer.scheduledTimer(withTimeInterval: 42.0, repeats: false) { (timer) in // do stuff 42 seconds later }Кстати, имейте в виду: по умолчанию таймер добавляется в режим цикла запуска по умолчанию. Это означает, что таймер может быть заморожен, когда этот режим цикла находится на удержании (например, при прокрутке UIScrollView) Вы можете решить эту проблему, добавив таймер в определенный цикл выполнения режим:
RunLoop.current.add(timer, forMode: .commonModes)в этом блоге вы можете найти более подробную информацию.
попробуйте следующую функцию, реализованную в Swift 3.0 и выше
func delayWithSeconds(_ seconds: Double, completion: @escaping () -> ()) { DispatchQueue.main.asyncAfter(deadline: .now() + seconds) { completion() } }использование
delayWithSeconds(1) { //Do something }
попробуйте ниже код для задержки
/ / Марк: первый путь
func delayForWork() { delay(3.0) { print("delay for 3.0 second") } } delayForWork()/ / Марк: второй путь
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // your code here }
/ / запускает функцию через x секунд
public static func runThisAfterDelay(seconds: Double, after: @escaping () -> Void) { runThisAfterDelay(seconds: seconds, queue: DispatchQueue.main, after: after) } public static func runThisAfterDelay(seconds: Double, queue: DispatchQueue, after: @escaping () -> Void) { let time = DispatchTime.now() + Double(Int64(seconds * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC) queue.asyncAfter(deadline: time, execute: after) }//использование:-
runThisAfterDelay(seconds: x){ //write your code here }
также можно использовать это:
Thread.sleep(until: Date(timeIntervalSinceNow: 2.5))эта строка кода блокирует текущий поток до окончания указанного времени. Время задержки определяется в формате даты. Выше используемая версия инициализатора даты просто принимает значение за секунду в двойном формате. Это значение может иметь разрешение миллисекунды.
обратите внимание, что если вы вызовете этот код в главном потоке, пользовательский интерфейс замерзнет на указанное время.
Comments