Swift performSelector: withObject: afterDelay: [dupliquer]

cette question a déjà une réponse ici:

J'ai une application dans L'objectif C que je fais la transition vers Swift. Dans L'objectif C, j'ai cette méthode:

[self.view performSelector:@selector(someSelector) withObject:self afterDelay:0.1f];

je suis travailler avec Swift et je ne peux pas trouver comment faire ça. J'ai essayé:

self.view.performSelector(Selector("someSelector"), withObject: self, afterDelay: 0.1)

Voici l'erreur que j'obtiens: 'performSelector' is unavailable: 'performSelector' methods are unavailable

comment appeler une méthode afterDelay ?

mise à JOUR

voilà ce que j'ai fini par dire:

extension NSObject {

    func callSelectorAsync(selector: Selector, object: AnyObject?, delay: NSTimeInterval) -> NSTimer {

        let timer = NSTimer.scheduledTimerWithTimeInterval(delay, target: self, selector: selector, userInfo: object, repeats: false)
        return timer
    }

    func callSelector(selector: Selector, object: AnyObject?, delay: NSTimeInterval) {

        let delay = delay * Double(NSEC_PER_SEC)
        let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
        dispatch_after(time, dispatch_get_main_queue(), {
            NSThread.detachNewThreadSelector(selector, toTarget:self, withObject: object)
        })
    }
}
127
demandé sur Mahmoud Adam 2014-06-11 22:43:07

3 réponses

Swift 3

DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(0.1)) {
    // your function here
}

Swift 2

let 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 
})
145
répondu brandonscript 2017-11-05 20:45:01

Vous pourriez faire ceci:

var timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("someSelector"), userInfo: nil, repeats: false)

func someSelector() {
    // Something after a delay
}

SWIFT 3

let timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(someSelector), userInfo: nil, repeats: false)

func someSelector() {
    // Something after a delay
}
108
répondu StevenOjo 2017-01-20 00:00:40
Le Swift

est statiquement typé de sorte que les méthodes performSelector: doivent être reléguées au second plan.

au lieu de cela, utilisez GCD pour envoyer un bloc approprié à la file d'attente pertinente - dans ce cas, ce sera probablement la file d'attente principale car il semble que vous faites UIKit travail.

EDIT: le performSelector: pertinent est également absent de la version Swift de la NSRunLoop documentation ("1 Objectif-C symbole caché") donc vous on ne peut pas sauter directement avec ça. Avec cela et son absence de la Swiftified NSObject je dirais que C'est assez clair ce Qu'Apple pense ici.

9
répondu Tommy 2014-06-11 19:11:09