Подтвердить что ты не робот

Dispatch_after эквивалент в 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)];
    }

});
4b9b3361

Ответ 1

NSOperationQueue не имеет в нем никакого механизма синхронизации. Если вам нужно настроить такую ​​задержку, а затем выполнить операцию, вам нужно запланировать NSOperation из dispatch_after, чтобы обрабатывать как задержку, так и сделать окончательный код NSOperation.

NSOperation предназначен для обработки более или менее пакетных операций. Вариант использования немного отличается от GCD и фактически использует GCD на платформах с GCD.

Если проблема, которую вы пытаетесь решить, - получить отменяемое уведомление по таймеру, я бы предложил использовать NSTimer и аннулировать его, если вам нужно отменить его. Затем в ответ на таймер вы можете выполнить свой код или использовать диспетчерскую очередь или NSOperationQueue.

Ответ 2

Вы можете использовать dispatch_after() с глобальной очередью, а затем планировать операцию в своей очереди операций. Блоки, переданные в dispatch_after(), не выполняются после указанного времени, они просто планируются после этого времени.

Что-то вроде:

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

Ответ 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];

Ответ 4

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

Ответ 5

Свифт 4:

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

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