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)];
}
});
Ответы
Ответ 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...
}
}