在NSOperationQueue dispatch_after相当于

问题描述 投票:16回答:5

我是从正规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)];
    }

});
ios objective-c xcode grand-central-dispatch nsoperationqueue
5个回答
26
投票

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

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

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


2
投票

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

就像是:

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

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

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

0
投票

斯威夫特4:

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

                self. myOperationQueue.addOperation {
                    //...code...
                }
            }
© www.soinside.com 2019 - 2024. All rights reserved.