在NSOperationQueue dispatch_after相当于(dispatch_after

2019-08-17 17:33发布

我正在从普通的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)];
    }

});

Answer 1:

NSOperationQueue没有在任何计时机制。 如果您需要设置这样的延迟,然后执行的操作,你要安排NSOperationdispatch_after为了同时处理的延迟,使最终代码NSOperation

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

如果你正在试图解决的问题是获得一个取消计时器通知,我建议使用NSTimer和无效的,如果你需要取消它。 然后,响应于定时器,你可以执行你的代码,或者使用调度队列或NSOperationQueue。



Answer 2:

您可以继续使用dispatch_after()与全球队列,然后安排在你的操作队列中的操作。 传递给块dispatch_after()在指定时间后不执行,它们只是在此时间之后调度。

就像是:

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


Answer 3:

你可以做的是执行睡眠的的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];


Answer 4:

[operationQueue performSelector:@selector(addOperation:) 
                     withObject:operation 
                     afterDelay:delay];


Answer 5:

斯威夫特4:

DispatchQueue.global().asyncAfter(deadline: .now() + 10 { [weak self] in
                guard let `self` = self else {return}

                self. myOperationQueue.addOperation {
                    //...code...
                }
            }


文章来源: dispatch_after equivalent in NSOperationQueue