Я пытаюсь создать полет с помощью DJI SDK через Virtual Sticks. Я разработал, как управлять дроном в направлении координаты GPS, используя функцию atan2 для вычисления угла между двумя координатами GPS, затем поверните дрон к этому углу и наклоните, чтобы двигаться в этом направлении.
Я хочу пересчитывать азимут, рыскание и тангаж по компасу каждые пару секунд для учета ветра и дрейфа и т. Д. c, но я не хочу запускать его в основном потоке, если он блокирует пользовательский интерфейс. Или взаимодействие с пользовательским интерфейсом приводит к тому, что таймер не срабатывает, и происходит пропущенный расчет.
Следует ли мне использовать dispatch_source_set_timer
в сочетании с GCD или есть лучший способ добиться этого и избежать утечек памяти? Пример кода ниже:
образец кода взят из другого вопрос ответ
// Create a dispatch source that'll act as a timer on the concurrent queue
dispatch_source_t dispatchSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0));
// Setup params for creation of a recurring timer
double interval = 2.0;
dispatch_time_t startTime = dispatch_time(DISPATCH_TIME_NOW, 0);
uint64_t intervalTime = (int64_t)(interval * NSEC_PER_SEC);
dispatch_source_set_timer(dispatchSource, startTime, intervalTime, 0);
// Attach the block you want to run on the timer fire
dispatch_source_set_event_handler(dispatchSource, ^{
// code to calculate bearing and send Virtual Stick commands to yaw and pitch drone
});
// Start the timer
dispatch_resume(dispatchSource);
// ----
// When you want to stop the timer, you need to suspend the source
dispatch_suspend(dispatchSource);
// If on iOS5 and/or using MRC, you'll need to release the source too
dispatch_release(dispatchSource);