ios - create - timer swift 4
NSTimer no dispara el selector (4)
En ios5.0 con ARC, en mi rootviewcontroller llamo a un método en un objeto del administrador de seguridad que tiene el delegado de la aplicación. En ese método configuro el temporizador de la siguiente manera
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self
selector:@selector(updateModel:) userInfo:str repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
Sin embargo, esto nunca dispara el selector ie. updateModel: nunca se llama. ¿Qué puede estar mal? ¿Hay otra forma más eficiente de hacerlo sin usar NStimer?
Detecto el mismo problema y enciendo el temporizador en la cola principal para resolverlo:
[NSURLConnection sendAsynchronousRequest:request queue:_operationQueue
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
[self loopUpUpdateStart];
}];
-(void)loopUpUpdateStart{
dispatch_async(dispatch_get_main_queue(), ^{
_loopTimerForUpRevision =
NSTimer scheduledTimerWithTimeInterval: kNetworkLoopIntervalUpRev
target: self
selector: @selector(myCoolMethod)
userInfo: nil
repeats: YES];
TRACE(@"Start Up updates");
});
}
Esta línea tiene varios problemas:
[[NSRunLoop currentRunLoop] addTimer:ApplicationDelegate.timer forMode:NSRunLoopCommonModes];
Primero, no debería ser requerido en absoluto. -scheduledTimerWithTimeInterval:...
ya agrega el temporizador al runloop. No es necesario que lo agregue de nuevo.
Segundo, el timer
variable local no está relacionado con la propiedad ApplicationDelegate.timer
(que probablemente sea nil
en este punto).
Si está hablando tanto con el delegado de la aplicación que ha creado algo llamado ApplicationDelegate
(¿una global? ¿Una macro?), Está hablando demasiado con él. El delegado de la aplicación es el delegado de la aplicación; Ayuda a la aplicación a iniciar y detener y responder a los eventos del sistema. El delegado de la aplicación no es un lugar para almacenar variables globales. Un temporizador definitivamente no es el tipo de cosa que obtendrías de otro objeto en cualquier caso.
Pareces estar un poco confundido con tu variable de temporizador.
Inicializa un nuevo temporizador pero en realidad no lo está utilizando. ¿Desea utilizar el temporizador que inicializó o desea utilizar ApplicationDelegate.timer?
Aquí están las dos posibles soluciones.
Opción uno (asumiendo que tiene una instancia de clase titulada ApplicationDelegate y que tiene una propiedad de temporizador):
ApplicationDelegate.timer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(updateModel:) userInfo:str repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:ApplicationDelegate.timer forMode:NSRunLoopCommonModes];
Opción Dos:
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(updateModel:) userInfo:str repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
También podría ser un problema de subprocesos:
Si
[NSThread isMainThread]
es falso, entonces inicie el temporizador de esta manera:
dispatch_async(dispatch_get_main_queue(), ^{
timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(tick:) userInfo:nil repeats:YES];
})