Как запрограммировать задержку в 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?

754   6  

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

    Ничего не найдено.