Estoy intentando cancelar y luego lanzar un temporizador suspendido, pero cuando invoco 'dispatch_release' en él, inmediatamente obtengo EXC_BAD_INSTRUCTION.dispatch_source_cancel en un temporizador suspendido provoca EXC_BAD_INSTRUCTION
¿No es este un conjunto de acciones válido para tomar en un temporizador?
creación temporizador & suspensión:
@interface SomeClass: NSObject { }
@property (nonatomic, assign) dispatch_source_t timer;
@end
// Class implementation
@implementation SomeClass
@synthesize timer = _timer;
- (void)startTimer
{
dispatch_queue_t globalQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,
0, 0, globalQ);
dispatch_time_t startWhen = dispatch_walltime(DISPATCH_TIME_NOW, NSEC_PER_SEC * 1);
dispatch_source_set_timer(_timer, startWhen, 1 * NSEC_PER_SEC, 5000ull);
dispatch_source_set_event_handler(_timer, ^{
// Perform a task
// If a particular amount of time has elapsed, kill this timer
if (timeConstraintReached)
{
// Can I suspend this timer within it's own event handler block?
dispatch_suspend(_timer);
}
});
dispatch_resume(_timer);
}
- (void)resetTimer
{
dispatch_suspend(_timer);
dispatch_source_cancel(_timer);
// dispatch_release causes
// 'EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
dispatch_release(_timer);
self.timer = nil;
}
@end
Además, puedo invocar dispatch_suspend dentro del bloque event_handler de una fuente temporizador?
Cualquier ayuda sería apreciada.
Ah, ya veo. Como cada dispatch_suspend 'incrementa el recuento de suspensiones del objeto', tiene que haber un 'dispatch_resume' para equilibrar la suspensión. –
¿Es factible cancelar o suspender el temporizador dentro de su bloque event_handler o tiene que suceder fuera del bloque? –
Correcto, sí. Ver mi respuesta actualizada. Si bien los documentos en realidad no indican (que puedo encontrar) que no puedes liberar cuando se suspende, sospecho que tiene algún estado interno que causa maldad si lo haces. – mattjgalloway