DISPATCH_SOURCE_TYPE_TIMER не стреляет - PullRequest
4 голосов
/ 21 января 2011

Я создаю таймер в глобальной очереди, настроенный на 45 секунд с момента создания, но по какой-то причине он вообще не срабатывает. Изменение его на огонь теперь тоже ничего не делает.

В приложении для отдыха много чего происходит, поэтому, возможно, что-то препятствует срабатыванию таймера.

Вот как создается таймер:

dispatch_queue_t globalQueue = 
        dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0); 

timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, globalQueue); 
if (timer) {

// start 45 seconds for now
dispatch_time_t startTime = dispatch_time(DISPATCH_TIME_NOW, 45ull * NSEC_PER_SEC);
uint64_t interval = 15ull * NSEC_PER_SEC; // every 15 seconds, converted to nanosecs

// leeway:8 microseconds
dispatch_source_set_timer(timer, startTime, interval, 8000ull); 

dispatch_source_set_event_handler(timer, block); // block is passed in

dispatch_resume(timer);

1) Какой хороший способ попытаться отладить / выяснить, почему он не стреляет? Если нет, то

2) Есть ли способ перечислить все заданные задачи, которые запланированы для выполнения в очереди в определенный момент времени?

Некоторая часть работы, выполняемой приложением, не может быть запущена на симуляторе, поэтому мне нужно отладить само тестовое устройство.

Ответы [ 2 ]

2 голосов
/ 09 августа 2013

У меня была похожая проблема. Я предполагаю, что ваш таймер является локальной переменной и освобождается сразу после настройки. Вы можете сделать это свойством класса.
Посмотрите здесь .

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

Ваши константы должны быть длинными без знака, а не длинными без знака. Изменить на эти:

dispatch_time_t startTime = dispatch_time(DISPATCH_TIME_NOW, 45ull * NSEC_PER_SEC);
uint64_t interval = 15ull * NSEC_PER_SEC; // every 15 seconds, converted to nanosecs
...