Me pregunto si alguien puede explicar por qué enviando de vuelta a la cola principal y creando una repetición NSTimer
¿Tengo que agregarlo a RUN LOOP para que también se dispare? Incluso cuando utilizo performselectorOnMainThread
, todavía tengo que agregarlo a un RUN LOOP para que se dispare.NSTimer requiriéndome que lo agregue a un runloop
A continuación se muestra un ejemplo de mi pregunta:
#define queue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
#define mainqueue dispatch_get_main_queue()
- (void)someMethodBeginCalled
{
dispatch_async(queue, ^{
int x = 0;
dispatch_async(mainqueue, ^(void){
if([_delegate respondsToSelector:@selector(complete:)])
[_delegate complete:nil];
});
});
}
- (void)compelete:(id)object
{
[self startTimer];
//[self performSelectorOnMainThread:@selector(startTimer) withObject:nil waitUntilDone:NO];
}
- (void)startTimer
{
NSTimer timer = [NSTimer timerWithTimeInterval:3 target:self selector:@selector(callsomethingelse) userInfo:nil repeats:YES];
//NSDefaultRunLoopMode
[[NSRunLoop currentRunLoop] addTimer:_busTimer forMode:NSRunLoopCommonModes];
}
EDIT: creo redactado esta pregunta muy mal. Me gustaría saber por qué[[NSRunLoop currentRunLoop] addTimer:_busTimer forMode:NSRunLoopCommonModes];
es necesario en startTimer
si llamo al someMethodBeginCalled
. Si no incluyo esa línea, el temporizador no se dispara.
Si llamo a startTimer
de viewDidLoad
por ejemplo, puedo quitar la línea NSRunLoop
y el temporizador se disparará cada 60 segundos.
Este es el enfoque normal. Es raro agregar manualmente un temporizador a un runloop. En general, sin embargo, debe mantener el temporizador en un ivar para que pueda invalidarlo cuando sea necesario. –
Sí, de lo contrario, el objeto al que llama nunca será desasignado si tiene un temporizador repetitivo. – borrrden
He editado la pregunta, básicamente me pregunto por qué no puedo usar solo su línea cuando la inicializo desde dispatch_async en la cola principal. Sin la línea NSRunLoop, el temporizador no disparará. – chicken