Usted podría utilizar el método NSTimer
:
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds
invocation:(NSInvocation *)invocation
repeats:(BOOL)repeats;
en cambio, desde un objeto NSInvocation
le permitirá pasar argumentos; un objeto NSInvocation
es, como la docs definen:
un Objective-C mensaje rindió estático, es decir, que es una acción se convirtió en un objeto.
Si bien la creación de un objeto NSTimer
mediante un selector requiere el formato del ser método:
- (void)timerFireMethod:(NSTimer*)theTimer
Un NSInvocation
le permite establecer el objetivo, el selector, y los argumentos que se pasan en:
SEL selector = @selector(myMethod:setValue2:);
NSMethodSignature *signature = [MyObject instanceMethodSignatureForSelector:selector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setSelector:selector];
NSString *str1 = @"someString";
NSString *str2 = @"someOtherString";
//The invocation object must retain its arguments
[str1 retain];
[str2 retain];
//Set the arguments
[invocation setTarget:targetInstance];
[invocation setArgument:&str1 atIndex:2];
[invocation setArgument:&str2 atIndex:3];
[NSTimer scheduledTimerWithTimeInterval:0.1 invocation:invocation repeats:YES];
Dónde MyObject
es la clase que se declara myMethod:setValue2:
y ejecutarse - instanceMethodSignatureForSelector:
es una functi conveniencia en declarado en NSObject
que devuelve un objeto NSMethodSignature
para usted, que se pasará a NSInvocation
.
También, tomar nota, con setArgument:atIndex:
, los índices de los argumentos que se pasan al método establecido como el inicio de selección en el índice 2. A partir de la documentación:
índices 0 y 1 indican los argumentos ocultos auto y _cmd, respectivamente; debe establecer estos valores directamente con setTarget: y setSelector: methods.Use los índices 2 y mayores para los argumentos normalmente aprobados en un mensaje.
Esta es una mejor respuesta que la mía. Debe hacer esto para evitar contaminar sus implementaciones con métodos innecesarios. –
Tenga en cuenta que, si 'str1' y' str2' no estuvieran asignados estáticamente, los filtraría. 'NSTimer' está documentado como el envío de' -retainArguments' a su objeto de invocación, pero no sería malo para usted enviar '-retainArguments' al objeto de invocación usted mismo. El problema es retener los argumentos usted mismo, y luego decirle a la invocación que los retenga también. ¡No retenga los argumentos de invocación usted mismo! Deje que la invocación lo maneje, y, aquí, deje que el temporizador lo maneje por sí mismo. –
No codifique la clase de 'targetInstance', como se hizo al recuperar la firma del método. Si realmente desea utilizar '+ instanceMethodSignatureForSelector:', puede usar '[[clase de instancia de destino] instanciaMethodSignatureForSelector: selector]', pero eso es innecesariamente complejo: simplemente solicite al objeto en sí la firma del método usando '[targetInstance methodSignatureForSelector: selector]' . –