18

我将我的代码从常规 GCD 移动到,NSOperationQueue因为我需要一些功能。我的很多代码都依赖于 dispatch_after 才能正常工作。有没有办法用 a 做类似的事情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)];
    }

});
4

6 回答 6

30

NSOperationQueue它没有任何计时机制。如果您需要像这样设置延迟然后执行操作,您需要安排NSOperationfromdispatch_after以处理延迟并将最终代码设置为NSOperation.

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

如果您要解决的问题是获得可取消的计时器通知,我建议NSTimer您在需要取消它时使用并使其无效。然后,响应计时器,您可以执行代码,或使用调度队列或 NSOperationQueue。

于 2013-03-18T15:39:25.950 回答
2

您可以继续使用dispatch_after()全局队列,然后在您的操作队列上安排操作。传递给的块dispatch_after()在指定时间之后不执行,它们只是在该时间之后安排。

就像是:

dispatch_after
(
    mainPopTime,
    dispatch_get_main_queue(),
    ^ {
        [myOperationQueue addOperation:theOperationObject];
    }
);
于 2013-03-18T15:36:43.550 回答
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];
于 2014-04-11T06:55:32.610 回答
0
[operationQueue performSelector:@selector(addOperation:) 
                     withObject:operation 
                     afterDelay:delay];
于 2016-10-24T12:55:59.640 回答
0

斯威夫特 4:

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

                self. myOperationQueue.addOperation {
                    //...code...
                }
            }
于 2019-02-07T09:49:31.407 回答
0

晚了七年,但 iOS 7 将此功能引入了 OperationQueue。

https://developer.apple.com/documentation/foundation/operationqueue/3329365-schedule

于 2020-08-12T22:35:49.267 回答