我正在将我的代码从常规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)];
}
});
答案 0 :(得分:26)
NSOperationQueue
中没有任何计时机制。如果您需要设置这样的延迟然后执行操作,您需要从NSOperation
安排dispatch_after
以便处理延迟并使最终代码成为{{ 1}}。
NSOperation
旨在处理或多或少的批处理操作。用例与GCD略有不同,实际上在使用GCD的平台上使用GCD。
如果您要解决的问题是获取可取消的计时器通知,我建议您使用NSOperation
并在需要取消时使其无效。然后,为响应计时器,您可以执行代码,或使用调度队列或NSOperationQueue。
答案 1 :(得分:2)
您可以继续将dispatch_after()
与全局队列一起使用,然后在操作队列上安排操作。传递给dispatch_after()
的块在指定的时间之后不会执行,它们只是在那段时间之后安排。
类似的东西:
dispatch_after
(
mainPopTime,
dispatch_get_main_queue(),
^ {
[myOperationQueue addOperation:theOperationObject];
}
);
答案 2 :(得分:0)
你可以制作一个执行睡眠的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];
答案 3 :(得分:0)
[operationQueue performSelector:@selector(addOperation:)
withObject:operation
afterDelay:delay];
答案 4 :(得分:0)
迅速4:
DispatchQueue.global().asyncAfter(deadline: .now() + 10 { [weak self] in
guard let `self` = self else {return}
self. myOperationQueue.addOperation {
//...code...
}
}
答案 5 :(得分:0)
晚了七年,但iOS 7将此功能引入了OperationQueue。
https://developer.apple.com/documentation/foundation/operationqueue/3329365-schedule