para objective for ios objective-c swift xcode6

ios - objective - xcode 6



Swift performSelector: withObject: afterDelay: (3)

Esta pregunta ya tiene una respuesta aquí:

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