Я прошел iBook от Apple, и не мог найти его определение:
Может кто-нибудь объяснить структуру dispatch_after
?
dispatch_after(<#when: dispatch_time_t#>, <#queue: dispatch_queue_t?#>, <#block: dispatch_block_t?#>)
objective-c
swift
grand-central-dispatch
Кумар К.Л.
источник
источник
Ответы:
Более четкое представление о структуре:
dispatch_time_t
являетсяUInt64
. Наdispatch_queue_t
самом деле тип является псевдонимом для anNSObject
, но вы должны просто использовать знакомые методы GCD для получения очередей. Блок Swift закрывается. В частности,dispatch_block_t
определяется как() -> Void
, что эквивалентно() -> ()
.Пример использования:
РЕДАКТИРОВАТЬ:
Я рекомендую использовать действительно замечательную
delay
функцию @ matt .РЕДАКТИРОВАТЬ 2:
В Swift 3 появятся новые обертки для GCD. Смотрите здесь: https://github.com/apple/swift-evolution/blob/master/proposals/0088-libdispatch-for-swift3.md
Исходный пример будет написан в Swift 3 следующим образом:
Обратите внимание, что вы можете написать
deadlineTime
объявление какDispatchTime.now() + 1.0
и получить тот же результат, потому что+
оператор переопределяется следующим образом (аналогично для-
):func +(time: DispatchTime, seconds: Double) -> DispatchTime
func +(time: DispatchWalltime, interval: DispatchTimeInterval) -> DispatchWalltime
Это означает, что если вы не используете
DispatchTimeInterval
enum
и просто пишете число, предполагается, что вы используете секунды.источник
dispatch_after(1, dispatch_get_main_queue()) { println("test") }
1
вdispatch_after(1, ...
может вызвать много путаницы здесь. Люди подумают, что это количество секунд, а на самом деле это наносекунда . Предлагаю посмотреть ответ @brindy о том, как правильно создать этот номер.1
на,dispatch_time(DISPATCH_TIME_NOW, Int64(1 * Double(NSEC_PER_SEC)))
потому что это приводит к путанице. Люди могут подумать, что вам не нужно создавать dispatch_time_t в SwiftBinary operator '+' cannot be applied to operands of type DispatchTime and '_'
на линииlet delayTime = DispatchTime.now() + .seconds(1.0)
DispatchTime.now() + 1.0
кажется, это единственный способ заставить его работать (не нужно.seconds
)Я использую
dispatch_after
так часто, что написал служебную функцию верхнего уровня, чтобы упростить синтаксис:И теперь вы можете говорить так:
Вау, язык, на котором ты можешь улучшить язык. Что может быть лучше?
Обновление для Swift 3, Xcode 8 Seed 6
Кажется, почти не стоит беспокоиться, теперь, когда они улучшили синтаксис вызова:
источник
func delayInSec(delay: Double) -> dispatch_time_t { return dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))) }
return
).1.0 ~~ { code...}
Свифт 3+
Это очень легко и элегантно в Swift 3+:
Старый ответ:
Чтобы расширить ответ Цезария, который будет выполнен через 1 наносекунду, мне пришлось выполнить следующее, чтобы выполнить через 4 с половиной секунды.
Изменить: я обнаружил, что мой исходный код был немного неправильно. Неявная типизация вызывает ошибку компиляции, если вы не приведете NSEC_PER_SEC к Double.
Если кто-нибудь может предложить более оптимальное решение, я бы хотел услышать его.
источник
dispatch_get_current_queue()
. Я использовалdispatch_get_main_queue()
вместо этого.dispatch_get_main_queue()
это то, что вы должны использовать. Буду обновлять.Синтаксис matt очень хорош, и если вам нужно сделать блок недействительным, вы можете использовать это:
Используйте как следовать
кредиты
Ссылка выше, кажется, не работает. Оригинальный код Objc от Github
источник
performSelector:afterDelay:
теперь доступно в Swift 2, так что вы можете отменить его.dispatch_source_t
, потому что это то, что вы можете отменить).Самое простое решение в Swift 3.0 и Swift 4.0 и Swift 5.0
Применение
источник
У Apple есть фрагмент dispatch_after для Objective-C :
Вот тот же фрагмент, портированный на Swift 3:
источник
Другой способ - расширить Double следующим образом:
Тогда вы можете использовать это так:
Мне нравится функция задержки Мэтта, но я просто предпочитаю ограничивать передачу замыканий вокруг.
источник
В Swift 3.0
Отправка очередей
Отправка через 5 секунд
источник
Версия Swift 3.0
После функции закрытия выполнить некоторую задачу после задержки в главном потоке.
Вызовите эту функцию как:
источник
1) Добавьте этот метод как часть UIViewController Extension.
Вызовите этот метод на VC:
2)
3)
// Компактная форма
источник
Хотя ОП не является первоначальным вопросом, некоторые
NSTimer
связанные вопросы были помечены как дубликаты этого вопроса, поэтому стоит включитьNSTimer
ответ.NSTimer
противdispatch_after
NSTimer
более высокий уровень в то время какdispatch_after
более низкий уровень.NSTimer
проще отменить. отменаdispatch_after
требует написания большего количества кода .Задержка задачи с
NSTimer
Создать
NSTimer
экземпляр.Запустите таймер с нужной вам задержкой.
Добавьте функцию, которая будет вызвана после задержки (используя любое имя, которое вы использовали для
selector
параметра выше).Ноты
timer.invalidate()
.repeats: true
.Если у вас есть одноразовое событие без необходимости отмены, то нет необходимости создавать
timer
переменную экземпляра. Следующего будет достаточно:Смотрите мой полный ответ здесь .
источник
Для нескольких функций используйте это. Это очень полезно для использования анимации или загрузчика активности для статических функций или любого обновления пользовательского интерфейса.
Например, используйте анимацию перед перезагрузкой tableView. Или любое другое обновление интерфейса после анимации.
источник
Это сработало для меня.
Свифт 3:
Objective-C:
источник
Свифт 3 и 4:
Вы можете создать расширение в DispatchQueue и добавить функцию delay, которая использует функцию DispatchQueue asyncAfter для внутреннего использования.
использовать:
источник
Другой помощник для задержки вашего кода, который используется на 100% Swift и дополнительно позволяет выбрать другой поток для запуска вашего кода с задержкой:
Теперь вы просто задерживаете свой код в главном потоке следующим образом:
Если вы хотите отложить ваш код в другой поток :
Если вы предпочитаете Framework, в котором также есть несколько удобных функций, обратитесь к HandySwift . Вы можете добавить его в свой проект через Carthage, а затем использовать его точно так же, как в примерах выше, например:
источник
Я всегда предпочитаю использовать расширение вместо бесплатных функций.
Swift 4
Используйте как следовать.
источник
Задержка вызова GCD с использованием asyncAfter в swift
Мы можем задержать как ** микросекунды , миллисекунды , наносекунды
источник
В Swift 4
Используйте этот фрагмент:
источник
dispatch_after(_:_:_:)
Функция принимает три параметра:dispatch_after(_:_:_:)
Функция вызывает блок или замыкание на очереди отправки, которая передается функции после заданной задержки. Обратите внимание, что задержка создается с помощьюdispatch_time(_:_:)
функции. Запомните это, потому что мы также используем эту функцию в Swift.Я рекомендую пройти учебник Raywenderlich Dispatch учебник
источник
В Swift 5 используйте ниже:
источник
используйте этот код для выполнения некоторой связанной с пользовательским интерфейсом задачи через 2,0 секунды.
Версия Swift 3.0
После функции закрытия выполнить некоторую задачу после задержки в главном потоке.
Вызовите эту функцию как:
источник
Теперь больше, чем синтаксический сахар для асинхронных отправлений в Grand Central Dispatch (GCD) в Swift.
добавить подфайл
Затем вы можете использовать это так.
источник
Swift 4 имеет довольно короткий способ сделать это:
источник
Вот синхронная версия asyncAfter в Swift:
Наряду с асинхронным:
источник