Я думаю, что вообще не нужно создавать новый цикл запуска для таймера. Я хотел бы предложить один из двух подходов:
NSTimer
Расписания на основном цикле выполнения, но есть вызываемый метод затем направить запрос в фоновую очередь.
Создать диспетчерский таймер, который планируется запустить в назначенной очереди отправки фона. Чтобы сделать это, создать диспетчерское свойство таймера:
@property (nonatomic, strong) dispatch_source_t timer;
, а затем создать экземпляр и начать источник таймера отправки для запуска на вашей обозначенную очереди НОДА:
dispatch_queue_t queue = dispatch_queue_create("com.domain.app.polltimer", 0);
self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(self.timer, dispatch_walltime(NULL, 0), kPollFrequencySeconds * NSEC_PER_SEC, 1ull * NSEC_PER_SEC);
dispatch_source_set_event_handler(self.timer, ^{
<#code to be run upon timer event#>
});
dispatch_resume(self.timer);
Есть времена, что создает новый прогон цикл полезен, но в этом простом сценарии он не нужен.
Сказав это, вероятно, не имеет смысла использовать таймер для инициирования сети каждые шесть секунд. Вместо этого вы, вероятно, захотите начать следующий запрос через шесть секунд после завершения предыдущего . По ряду причин ваш сервер может не отвечать в течение шести секунд, и вы не хотите, чтобы в этих сценариях возникали параллельные запросы (что может произойти, если ваши запросы выполняются асинхронно).
Итак, я был бы склонен, что завершение блока callMyAPI
сделать что-то же просто, как:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6.0 * NSEC_PER_SEC)), queue, ^{
<#code to issue next request#>
});
Это устраняет необходимость таймеров (и пользовательских запуска циклов) полностью.
Наконец, если вам действительно необходимо обнаружить изменения системы с этой частотой, это может предложить совершенно другую архитектуру сервера. Например, если вы каждые шесть секунд проверяете, что-то изменилось на сервере, вы можете рассмотреть реализацию на основе сокетов или использовать push-уведомления. В обоих этих подходах сервер скажет клиентским приложениям, когда произойдет значительное событие, а не приложение, похожее на Барта Симпсона на заднем сиденье автомобиля, постоянно спрашивает: «Мы еще там?»
Соответствующая архитектура, вероятно, зависит от частоты, с которой данные сервера могут меняться и каковы требования к клиентскому приложению.
Большое спасибо! Я пытаюсь использовать сокет сейчас, но я не знал, какое время подходит для создания нового цикла цикла, вместо того, чтобы просто использовать один созданный основной поток и отсоединить новый поток, чтобы справиться с событием после получения sth от источника? –
Я мог бы склониться к установке другой runloop, если бы была какая-либо возможность негативно повлиять на основной цикл запуска. Но запуск чего-то каждые шесть секунд нигде не приближается к этому порогу. И, как я предложил, с помощью таймера GCD или 'dispatch_after', он сокращает узел Gordian. – Rob