приостановка таймеров отправки из main_queue, когда он был создан на другом - PullRequest
0 голосов
/ 26 января 2011

Можете ли вы приостановить GCD-таймер из очереди, кроме той, в которой он запланирован?

У меня есть таймер, созданный для global_queue с низким приоритетом, и когда он срабатывает, я манипулирую некоторыми пользовательскими интерфейсами через main_queue. Для некоторых состояний в пользовательском интерфейсе я должен приостановить таймер. Нужно ли переключаться с main_queue обратно в очередь с низким приоритетом для выполнения приостановки?

dispatch_queue_t lowPriQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);   
myTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, lowPriQ);        

dispatch_source_set_timer(myTimer, 
                          startTime, // now
                          interval, // 15 seconds
                          2000ull); 

// configure the event handler
dispatch_source_set_event_handler(myTimer, ^{           
    NSLog(@"Timer fired");

    // UI Work
    dispatch_async(dispatch_get_main_queue(), ^ {
            [self doSomeButtonEnableDisable]
    });                        
});

dispatch_resume(myTimer); // start the timer

- (void)doSomeButtonEnableDisable
{
    if (someParticularState) {
        // Turn off the timer 

        // Should I suspend the timer on the low priority global queue
        // or is it valid to suspend on the main queue?

        dispatch_queue_t lowPriQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);   

        dispatch_async(lowPriQ(), ^ {

            dispatch_suspend(myTimer);
        });                            
    }
}

1 Ответ

1 голос
/ 26 января 2011

Да, допустимо приостановить отправку объекта из любой очереди.Если блок в данный момент выполняется при вызове dispatch_suspend (), этот блок завершит выполнение, и последующим запланированным блокам будет запрещено выполнение.

...