Задержка действий в Swift

Попробуйте это: в html: class="popupp" измените на id="popupp"

и в javascript: document.getElementById("popupp").style.visibility = visible; измените на document.getElementById("popupp").style.visibility = "visible";

Демо

29
задан 23 November 2014 в 02:35
поделиться

4 ответа

dispatch_after() - это стандартный способ задержки действий.

indicator.startAnimating()

let delay = 4.5 * Double(NSEC_PER_SEC)
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
dispatch_after(time, dispatch_get_main_queue()) {
    indicator.stopAnimating()
}

См .: dispatch_after - GCD in swift?


Обновление для Swift 3.0

indicator.startAnimating()

let delay = Int(4.5 * Double(1000))
DispatchQueue.main.after(when: .now() + .milliseconds(delay)) {
    indicator.stopAnimating()
}

Однако, Я думаю, что в духе Swift 3.0 расширение DispatchQueue было бы лучшим решением.

extension DispatchQueue {
    func delay(_ timeInterval: TimeInterval, execute work: () -> Void) {
        let milliseconds = Int(timeInterval * Double(1000))
        after(when: .now() + .milliseconds(milliseconds), execute: work)
    }
}

Это оставляет нас с очень хорошим

indicator.startAnimating()

DispatchQueue.main.delay(4.5) {
    indicator.stopAnimating()
}

Обновление 2

Копаясь в бета-версию Xcode 8.0, я нашел public func +(time: DispatchTime, seconds: Double) -> DispatchTime. Итак, я думаю, что это действительно так ...

indicator.startAnimating()

DispatchQueue.main.after(when: .now() + 4.5) {
    indicator.stopAnimating()
}

Я не думаю, что есть необходимость в расширении DispatchQueue для чего-то такого уже чистого.

-

Обновление для Swift 3.1

Существует новый синтаксис для Swift 3.1. Они просто любят что-то менять, не так ли?

indicator.startAnimating()

DispatchQueue.main.asyncAfter(deadline: .now() + 4.5) {
    indicator.stopAnimating()
}
79
ответ дан Community 23 November 2014 в 02:35
поделиться

С обновленным синтаксисом Swift 3 это становится

DispatchQueue.main.asyncAfter(deadline: .now() + 4.5) {
    indicator.stopAnimating()
}
10
ответ дан Matt Weinecke 23 November 2014 в 02:35
поделиться

Вот более чистый и выразительный код для этого, используя Swift 3.1 и Grand Central Dispatch:

Swift 3.1:

indicator.startAnimating()

// Runs after 1 second on the main queue.
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1) ) { 
    indicator.stopAnimating()
}

Также .seconds(Int), .microseconds(Int) и .nanoseconds(Int) могут быть использованы для времени.

9
ответ дан Hannes Sverrisson 23 November 2014 в 02:35
поделиться

Новое в iOS 10, Таймер имеет инициализатор блока , который выполняется в основном потоке. Это также немного более гибко, потому что вы можете взять ссылку на Таймер и отменить его или перенести его по факту.

    let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: false) {_ in 
    }
3
ответ дан Josh Homann 23 November 2014 в 02:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: