Swift performSelector: withObject: afterDelay: [dupliquer]
cette question a déjà une réponse ici:
- dispatch_after - PGCD dans swift? 22 réponses
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)
})
}
}
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
})
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
}
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.