我正在从普通的GCD我的代码NSOperationQueue
,因为我需要一些功能。 我的很多代码才能正常工作依赖于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
没有在任何计时机制。 如果您需要设置这样的延迟,然后执行的操作,你要安排NSOperation
从dispatch_after
为了同时处理的延迟,使最终代码NSOperation
。
NSOperation
旨在处理更多或更少的批处理操作。 用例是从GCD略有不同,而实际上使用GCD与GCD平台。
如果你正在试图解决的问题是获得一个取消计时器通知,我建议使用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];
斯威夫特4:
DispatchQueue.global().asyncAfter(deadline: .now() + 10 { [weak self] in
guard let `self` = self else {return}
self. myOperationQueue.addOperation {
//...code...
}
}