Soy un novato en iOS. Tengo un método de selector de la siguiente manera:
- (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second
{
}
Estoy tratando de implementar algo como esto:
[self performSelector:@selector(fooFirstInput:secondInput:) withObject:@"first" withObject:@"second" afterDelay:15.0];
Pero eso me da un error al decir:
Instance method -performSelector:withObject:withObject:afterDelay: not found
¿Alguna idea de lo que me estoy perdiendo?
iphone
ios
selector
performselector
Suchi
fuente
fuente
invoke
llamar:[inv performSelector:@selector(invoke) withObject:nil afterDelay:1];
Debo estar de acuerdo en que esta es una gran solución. ¡Feliz codificación para todos!Porque no existe el
[NSObject performSelector:withObject:withObject:afterDelay:]
método.Debe encapsular los datos que desea enviar en un solo objeto Objective C (por ejemplo, un NSArray, un NSDictionary, algún tipo Objective C personalizado) y luego pasarlos a través del
[NSObject performSelector:withObject:afterDelay:]
método que es bien conocido y querido.Por ejemplo:
fuente
NSNumber * whatToDoNumber = [NSNumber numberWithBool: doThis];
") y páselo como el único parámetro, @virata.Puede empaquetar sus parámetros en un objeto y usar un método auxiliar para llamar a su método original como Michael y otros ahora han sugerido.
Otra opción es dispatch_after, que tomará un bloque y lo pondrá en cola en un momento determinado.
O, como ya ha descubierto, si no necesita la demora, puede usar
- performSelector:withObject:withObject:
fuente
__weak
para darle a su temporizador simulado solo un enlace débil a sí mismo, para que no termine extendiendo artificialmente el ciclo de vida de su objeto y, por ejemplo, si su performSelector: afterDelay: efectúa algo un poco como tail recursividad (aunque sin la recursividad) entonces resuelve el ciclo de retención.La opción más simple es modificar su método para que tome un solo parámetro que contenga ambos argumentos, como un
NSArray
oNSDictionary
(o agregar un segundo método que tome un solo parámetro, lo descomprima y llame al primer método, y luego llame al segundo método en un retrasar).Por ejemplo, podría tener algo como:
Y luego, para llamarlo, puedes hacer:
fuente
NSDictionary
pierde la seguridad del tipo. No es ideal.performSelector:
(oNSInvocation
). Si eso le preocupa, la mejor opción probablemente sería pasar por GCD.y llámalo con:
fuente
Puede encontrar todos los tipos de métodos performSelector: proporcionados aquí:
http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html
Hay un montón de variaciones, pero no hay una versión que acepte varios objetos y un retraso. En su lugar, deberá resumir sus argumentos en un NSArray o NSDictionary.
fuente
No me gusta la forma NSInvocation, demasiado compleja. Mantengamos las cosas simples y limpias:
fuente
Acabo de hacer swizzling y necesitaba llamar al método original. Lo que hice fue hacer un protocolo y ponerle mi objetivo. Otra forma es definir el método en una categoría, pero necesitaría la supresión de una advertencia (#pragma clang diagnostic ignorado "-Wincomplete-deployment").
fuente
Una forma sencilla y reutilizable es ampliar
NSObject
e implementaralgo como:
fuente
Simplemente crearía un objeto personalizado con todos mis parámetros como propiedades y luego usaría ese único objeto como parámetro
fuente