ios objective-c xcode grand-central-dispatch nsoperationqueue

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];