web-dev-qa-db-fra.com

Swift performSelector: withObject: afterDelay: is not available

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)
        })
    }
}
132
Cody Winton

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 
})
152
brandonscript

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
}
109
StevenOjo

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.

9
Tommy