J'ai une application dans l'objectif C que je suis en train de passer à Swift. En Objective C, j'ai cette méthode:
[self.view performSelector:@selector(someSelector) withObject:self afterDelay:0.1f];
Je travaille avec Swift et je ne vois pas comment faire cela. J'ai essayé:
self.view.performSelector(Selector("someSelector"), withObject: self, afterDelay: 0.1)
Voici l'erreur que je reçois: 'performSelector' is unavailable: 'performSelector' methods are unavailable
Quel appel pourrais-je utiliser pour appeler une méthode afterDelay
?
UPDATE
Voici ce que j'ai fini avec:
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)
})
}
}
Swift 4
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// your function here
}
Swift
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
}
let timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(someSelector), userInfo: nil, repeats: false)
func someSelector() {
// Something after a delay
}
Swift est typé statiquement de sorte que les méthodes performSelector:
doivent être abandonnées.
Au lieu de cela, utilisez GCD pour envoyer un bloc approprié dans la file d'attente concernée. Dans ce cas, il s'agira probablement de la file d'attente principale car il semble que vous exécutiez le travail UIKit.
EDIT: le performSelector:
correspondant est aussi notablement absent de la version Swift de la documentation NSRunLoop
("1 symbole Objective-C masqué") ne peut pas sauter directement avec ça. Avec cela et son absence du Swiftified NSObject
, je dirais que c'est assez clair ce que Apple pense ici.