在NSOperationQueue中的dispatch_after等价物

时间:2013-03-18 15:31:20

标签: ios objective-c xcode grand-central-dispatch nsoperationqueue

我正在将我的代码从常规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)];
    }

});

6 个答案:

答案 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