В Swift 2 я смог использовать, dispatch_after
чтобы отложить действие, используя грандиозную центральную диспетчеризацию:
var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC)))
dispatch_after(dispatchTime, dispatch_get_main_queue(), {
// your function here
})
Но, похоже, это больше не компилируется со времен Swift 3. Какой предпочтительный способ написать это в современном Swift?
swift
swift4
grand-central-dispatch
swift5
brandonscript
источник
источник
UInt64
?Ответы:
Синтаксис просто:
Обратите внимание, что приведенный выше синтаксис добавления
seconds
как aDouble
кажется источником путаницы (особенно если мы привыкли добавлять nsec). ЭтотDouble
синтаксис «добавить секунды как » работает, потому чтоdeadline
естьDispatchTime
и, за кадром, есть+
оператор, который возьметDouble
и добавит столько секунд кDispatchTime
:Но если вы действительно хотите добавить целое число msec, μs или nsec к
DispatchTime
, вы также можете добавить aDispatchTimeInterval
к aDispatchTime
. Это означает, что вы можете сделать:Все это без проблем работает благодаря этому отдельному методу перегрузки для
+
оператора вDispatchTime
классе.Был задан вопрос, как отменить отправленное задание. Для этого используйте
DispatchWorkItem
. Например, это запускает задачу, которая будет запущена через пять секунд, или, если контроллер представления уволен и освобожден,deinit
он отменит задачу:Обратите внимание на использование
[weak self]
списка захвата вDispatchWorkItem
. Это важно, чтобы избежать сильного референтного цикла. Также обратите внимание, что это не делает упреждающего отмены, а просто останавливает запуск задачи, если это еще не сделано. Но если он уже начался к тому времени, когда он встречаетcancel()
вызов, блок завершит свое выполнение (если вы не проверяете вручнуюisCancelled
внутри блока).источник
DispatchTimeInterval
, как.milliseconds
требуютInt
. Но если просто добавить секунды, я бы использовалDouble
, напримерlet n: Double = 1.0; queue.asyncAfter(deadline: .now() + n) { ... }
.Свифт 4:
На время
.seconds(Int)
,.microseconds(Int)
а.nanoseconds(Int)
также могут быть использованы.источник
.milliseconds
лучше чем Double.DispatchTimeInterval
значения перечисления.case seconds(Int)
case milliseconds(Int)
case microseconds(Int)
case nanoseconds(Int)
.milliseconds is better than Double.
- Я хочу это на футболке;).Если вы просто хотите, чтобы функция задержки в
Свифт 4 и 5
Вы можете использовать его как:
источник
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1, execute: closure)
прощепосле выпуска Swift 3 также необходимо добавить @escaping
источник
Несколько иной вкус принятого ответа.
Swift 4
источник
Swift 4
Вы можете создать расширение в DispatchQueue и добавить функцию delay, которая использует
DispatchQueue
функцию asyncAfter внутри.и использовать
источник
вызов
DispatchQueue.main.after(when: DispatchTime, execute: () -> Void)
Я настоятельно рекомендую использовать инструменты XCode для преобразования в Swift 3 («Правка»> «Преобразовать»> «В текущий синтаксис Swift»). Уловил это для меня
источник
В Swift 4.1 и Xcode 9.4.1
Простой ответ ...
источник
Swift 5 и выше
источник
Ни в одном из ответов не упоминается работа в неосновной теме, поэтому добавляю свои 2 цента.
На главной очереди (основной поток)
ИЛИ
В глобальной очереди (не основной поток, основанный на указанном QOS).
ИЛИ
источник
Это сработало для меня в Swift 3
источник
Ты можешь использовать
источник
попробуй это
источник