Подтвердить что ты не робот

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

Я хочу сделать анимацию запуска активности, а затем остановить через одну секунду.

Так кто-нибудь знает, как я могу это сделать?

class stuff {
@IBOutlet weak var indicator: UIActivityIndicatorView!

   func iGotTriggeredBySomething {
      indicator.startAimating()
      //delay?
      indicator.stopAnimating()
   }
}

Спасибо, что ответили.

4b9b3361

Ответ 1

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 в быстром?


Обновление для 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()
}

Ответ 2

Вот более чистый и выразительный код для этого, используя 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).

Ответ 3

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

DispatchQueue.main.asyncAfter(deadline: .now() + 4.5) {
    indicator.stopAnimating()
}

Ответ 4

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

    let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: false) {_ in 
    }