dispatch_after等同于NSOperationQueue

我将我的代码从常规GCD移到NSOperationQueue,因为我需要一些function。 我的很多代码依赖dispatch_after才能正常工作。 有没有办法与NSOperation做类似的事情?

这是我需要转换为NSOperation的一些代码。 如果你能提供一个使用这个代码来转换它的例子,那就太好了。

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没有任何计时机制。 如果你需要像这样设置一个延迟,然后执行一个操作,你需要从dispatch_after安排NSOperation ,以便处理延迟和把最终代码作为NSOperation

NSOperation旨在处理或多或less的批处理操作。 用例与GCD略有不同,实际上在GCD平台上使用GCD。

如果你想解决的问题是得到一个可取消的计时器通知,我会build议使用NSTimer和无效,如果你需要取消它。 然后,为了响应计时器,你可以执行你的代码,或者使用一个调度队列或NSOperationQueue。

您可以继续使用dispatch_after()和全局队列,然后在您的操作队列上安排操作。 传递给dispatch_after()块不会在指定的时间之后执行,而是在那个时间之后进行调度。

就像是:

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

你可以做一个执行睡眠的NSOperation:MYDelayOperation。 然后将其添加为您的真实工作操作的依赖项。

 @interface MYDelayOperation : NSOperation ... - (void)main { [NSThread sleepForTimeInterval:delay]; // delay is passed in constructor } 

用法:

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