web-dev-qa-db-ger.com

Swift performSelector: withObject: afterDelay: ist nicht verfügbar

Ich habe eine App in Objective C, die ich auf Swift umstelle. In Ziel C habe ich diese Methode:

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

Ich arbeite mit Swift und ich kann nicht herausfinden, wie das geht. Ich habe versucht:

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

Hier ist der Fehler, den ich bekomme: 'performSelector' is unavailable: 'performSelector' methods are unavailable

Mit welchem ​​Aufruf würde ich eine Methode afterDelay aufrufen?

UPDATE

Folgendes ist mir eingefallen:

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

Sie könnten dies tun:

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

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

Schnell 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 ist statisch getippt, so dass das performSelector: Methoden sollen auf der Strecke bleiben.

Verwenden Sie stattdessen GCD, um einen geeigneten Block an die entsprechende Warteschlange zu senden. In diesem Fall handelt es sich vermutlich um die Hauptwarteschlange, da Sie anscheinend UIKit-Arbeiten ausführen.

EDIT: das relevante performSelector: fehlt auch vor allem in die Swift Version der NSRunLoop Dokumentation ("1 Objective-C Symbol versteckt"), so dass Sie nicht können Springen Sie direkt mit dem. Mit dem und seiner Abwesenheit vom Swiftified NSObject würde ich argumentieren, dass es ziemlich klar ist, was Apple hier denkt.

9
Tommy