ios - dispatch_after equivalente en NSOperationQueue
objective-c xcode (5)
NSOperationQueue
mi código de GCD regular a NSOperationQueue
porque necesito algunas de las funciones. Gran parte de mi código se basa en dispatch_after para funcionar correctamente. ¿Hay una manera de hacer algo similar con una NSOperation
?
Este es parte de mi código que se debe convertir a NSOperation
. Si pudieras proporcionar un ejemplo de conversión utilizando este código, sería genial.
dispatch_queue_t queue = dispatch_queue_create("com.cue.MainFade", NULL);
dispatch_time_t mainPopTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeRun * NSEC_PER_SEC));
dispatch_after(mainPopTime, queue, ^(void){
if(dFade !=nil){
double incriment = ([dFade volume] / [self fadeOut])/10; //incriment per .1 seconds.
[self doDelayFadeOut:incriment with:dFade on:dispatch_queue_create("com.cue.MainFade", 0)];
}
});
Podría hacer una NSOperation que realice un sueño: MYDelayOperation. Luego agréguelo como una dependencia para su operación de trabajo real.
@interface MYDelayOperation : NSOperation
...
- (void)main
{
[NSThread sleepForTimeInterval:delay]; // delay is passed in constructor
}
Uso:
NSOperation *theOperationObject = ...
MYDelayOperation *delayOp = [[MYDelayOperation alloc] initWithDelay:5];
[theOperationObject addDependency:delayOp];
[myOperationQueue addOperations:@[ delayOp, theOperationObject] waitUntilFinished:NO];
Puede seguir utilizando dispatch_after()
con una cola global, y luego programar la operación en su cola de operaciones. Los bloques pasados a dispatch_after()
no se ejecutan después del tiempo especificado, simplemente se programan después de ese tiempo.
Algo como:
dispatch_after
(
mainPopTime,
dispatch_get_main_queue(),
^ {
[myOperationQueue addOperation:theOperationObject];
}
);
Swift 4:
DispatchQueue.global().asyncAfter(deadline: .now() + 10 { [weak self] in
guard let `self` = self else {return}
self. myOperationQueue.addOperation {
//...code...
}
}
NSOperationQueue
no tiene ningún mecanismo de temporización. Si necesita configurar una demora como esta y luego ejecutar una operación, querrá programar la NSOperation
desde dispatch_after
para manejar la demora y hacer que el código final sea una NSOperation
.
NSOperation
está diseñado para manejar más o menos operaciones por lotes. El caso de uso es ligeramente diferente de GCD, y de hecho utiliza GCD en plataformas con GCD.
Si el problema que intenta resolver es obtener una notificación de temporizador cancelable, sugeriría usar NSTimer
e invalidarla si necesita cancelarla. Luego, en respuesta al temporizador, puede ejecutar su código o usar una cola de envío o NSOperationQueue.
[operationQueue performSelector:@selector(addOperation:)
withObject:operation
afterDelay:delay];