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)
})
}
}
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
})
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
}
let timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(someSelector), userInfo: nil, repeats: false)
func someSelector() {
// Something after a delay
}
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.