dispatch_after equivalente en NSOperationQueue

Muevo mi código de GCD regular a NSOperationQueue porque necesito parte de la funcionalidad. Una gran parte de mi código se basa en dispatch_after para funcionar correctamente. ¿Hay alguna manera de hacer algo similar con un NSOperation?

Este es parte de mi código que debe convertirse en NSOperation. Si pudieras dar un ejemplo de convertirlo usando 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)]; } }); 

NSOperationQueue no tiene ningún mecanismo de temporización. Si necesita configurar un retardo como este y luego ejecutar una operación, deseará progtwigr la NSOperation desde dispatch_after para manejar tanto el retardo como para convertir el código final en una NSOperation .

NSOperation está diseñado para manejar más o less operaciones por lotes. El caso de uso es ligeramente diferente de GCD, y de hecho usa GCD en plataforms con GCD.

Si el problema que está tratando de resolver es get una notificación de timer cancelable, sugeriría usar NSTimer e invalidarlo si necesita cancelarlo. Luego, en respuesta al timer, puede ejecutar su código o usar una queue de despacho o NSOperationQueue.

Puede seguir utilizando dispatch_after() con una queue global, luego progtwigr la operación en su queue de operaciones. Los bloques pasados ​​a dispatch_after() no se ejecutan después del time especificado, simplemente se progtwign después de ese momento.

Algo como:

 dispatch_after ( mainPopTime, dispatch_get_main_queue(), ^ { [myOperationQueue addOperation:theOperationObject]; } ); 

Podrías hacer una NSOperation que duerma: MYDelayOperation. A continuación, 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]; 
 [operationQueue performSelector:@selector(addOperation:) withObject:operation afterDelay:delay];