ios - objective - xcode 6
Swift performSelector: withObject: afterDelay: (3)
Esta pregunta ya tiene una respuesta aquí:
- dispatch_after - GCD en swift? 19 respuestas
Tengo una aplicación en Objective C que estoy haciendo la transición a Swift. En Objective C, tengo este método:
[self.view performSelector:@selector(someSelector) withObject:self afterDelay:0.1f];
Estoy trabajando con Swift y no puedo encontrar la manera de hacerlo. He intentado:
self.view.performSelector(Selector("someSelector"), withObject: self, afterDelay: 0.1)
Aquí está el error que recibo: ''performSelector'' is unavailable: ''performSelector'' methods are unavailable
¿Qué llamada usaría para llamar a un método después de afterDelay
?
ACTUALIZAR
Esto es lo que terminé con:
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)
})
}
}
Podrías hacer esto:
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
}
Swift está tipado estáticamente, por lo que los métodos de performSelector:
quedan en el camino.
En su lugar, use GCD para enviar un bloque adecuado a la cola relevante; en este caso, presumiblemente será la cola principal, ya que parece que está haciendo el trabajo de UIKit.
EDITAR: el performSelector:
relevante performSelector:
también falta en la versión Swift de la documentación de NSRunLoop
("1 símbolo de Objective-C oculto") por lo que no se puede saltar directamente con eso. Con eso y su ausencia del NSObject NSObject
, diría que es bastante claro lo que Apple está pensando aquí.
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
})