In earlier versions of Swift, one could create a delay with the following code:
let time = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), 4 * Int64(NSEC_PER_SEC))
dispatch_after(time, dispatch_get_main_queue()) {
//put your code which should be executed with a delay here
}
But now, in Swift 3, Xcode automatically changes 6 different things but then the following error appears: "Cannot convert DispatchTime.now
to expected value dispatch_time_t
aka UInt64
."
How can one create a delay before running a sequence of code in Swift 3?
Try the following function implemented in Swift 3.0 and above
Usage
//Runs function after x seconds
//Use:-
I do it in Swift 4:
This one line of code blocks the current thread until the specified time finished. Delay time is defined in Date format. The above used version of the Date initializer just take a value for second in Double format. This value could have millisecond resolution.
Note that if you call this code on the main thread the UI will freeze for the specified time.
I like one-line notation for GCD, it's more elegant:
Also, in iOS 10 we have new Timer methods, e.g. block initializer:
(so delayed action may be cancelled)
Btw, keep in mind: by default, timer is added to the default run loop mode. It means timer may be frozen when this loop mode is on hold (for example, when scrolling a UIScrollView) You can solve this issue by adding the timer to the specific run loop mode:
At this blog post you can find more details.
Try the below code for delay
After a lot of research, I finally figured this one out.
This creates the desired "wait" effect in Swift 3 and Swift 4.
Inspired by a part of this answer.