2016-11-17 8 views
1

В Swift 3 синтаксис GCD изменился совсем немного.Как DispatchQueue.main.asyncAfter (крайний срок: .now() + 5.0) работает в Swift 3?

Вызов dispatch_after() теперь выглядит следующим образом:

DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {//do something} 

Этот код будет ссылаться на блок 5 секунд после того, как он называется.

Как это работает? Документы говорят, что параметр крайнего срока - это dispatch_time_t, который является типом для UInt64. Я предполагаю, что это время в наносекундах. Однако синтаксис .now() + delay добавляет десятичные секунды к значению. Не DispatchTime.now() возвращает UInt64? Если это так, добавление десятичных секунд к этому не должно работать. Во всяком случае, я ожидаю, что добавленная стоимость добавится к .now(), которая будет рассматриваться как наносекунды, что было бы не очень полезно.

(В быстром 2 вы использовали, чтобы умножить значение на константу для числа наносекунд в секунду.)

ответ

0

ОК, я нашел ответ на свой вопрос в этой теме:

How do I write dispatch_after GCD in Swift 3?

Видимо есть переопределение из + оператора, который принимает DispatchTime и двойные, лечит двойной десятичные секунды, и возвращает результирующий DispatchTime.

+0

Если вы нажмете команду '+' в Xcode, вы увидите объявление. –

+0

@MartinR, спасибо за предложение. Для этого мне приходилось сталкиваться с тем, что это было переопределение оператора '+', который это делал. –

+0

Мне кажется, что нам нужна форма этого вызова, которая принимает значение задержки, а не время относительно текущего времени Маха, поскольку это, скорее всего, наиболее распространенная форма, используемая разработчиками приложений. Это было бы довольно простое расширение, но оно должно быть встроено. –