32

I have a problem with delaying computer's move in a game.

I've found some solutions but they don't work in my case, e.g.

var delay = NSTimer.scheduledTimerWithTimeInterval(4, target: self, selector: nil, userInfo: nil, repeats: false)

I tried to use this with function fire but also to no effects.

What other possibilities there are?

Dandy
  • 929
  • 2
  • 14
  • 23
  • 2
    You clearly don't understand what an NSTimer does. You need to have a selector, and have some code in that method you want to run when the timer fires. A timer without a selector doesn't do anything. – rdelmar Jan 16 '15 at 18:11
  • This answer is what you're looking for http://stackoverflow.com/a/24318861/3810673 – Ian Jan 16 '15 at 18:16
  • thank you very much! I didn't understand the selector because I don't get it why it should be in apostrophe. I put there my func and eveything works great. – Dandy Jan 16 '15 at 18:20

4 Answers4

108

Swift 3

With GCD:

let delayInSeconds = 4.0
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delayInSeconds) {

    // here code perfomed with delay

}

or with a timer:

func myPerformeCode() {

   // here code to perform
}
let myTimer : Timer = Timer.scheduledTimer(timeInterval: 4, target: self, selector: #selector(self.myPerformeCode), userInfo: nil, repeats: false)

Swift 2

With GCD:

let seconds = 4.0
let delay = seconds * Double(NSEC_PER_SEC)  // nanoseconds per seconds
let dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))

dispatch_after(dispatchTime, dispatch_get_main_queue(), {

   // here code perfomed with delay

})

or with a timer:

func myPerformeCode(timer : NSTimer) {

   // here code to perform
}
let myTimer : NSTimer = NSTimer.scheduledTimerWithTimeInterval(4, target: self, selector: Selector("myPerformeCode:"), userInfo: nil, repeats: false)
Dany Sousa
  • 229
  • 2
  • 16
valfer
  • 3,545
  • 2
  • 19
  • 24
7

With Swift 4.2

With Timer You can avoid using a selector, using a closure instead:

    Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) { (nil) in
        // Your code here
    }

Keep in mind that Timer is toll-free bridged with CFRunLoopTimer, and that run loops and GCD are two completely different approaches.... e

eharo2
  • 2,553
  • 1
  • 29
  • 39
2

In swift we can delay by using Dispatch_after.

SWift 3.0 :-

DispatchQueue.main.asyncAfter(deadline: .now()+4.0) {

        alert.dismiss(animated: true, completion: nil)
    }
Ramakrishna
  • 712
  • 8
  • 26
0

How about using Grand Central Dispatch?

https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/index.html

Valfer has shown you how

JSA986
  • 5,870
  • 9
  • 45
  • 91