@YaMirok

Как перерисовать View из другого потока?

Добрый день всем!
Такая задача. Есть коллекция объектов типа View, у которых переписан метод drawRect. В основном потоке создается вторичный поток с бесконечным циклом, в котором для каждой вьюхи вызывается определенный метод, по окончанию которого должна перерисовываться вьюха.

func StartStopTapped(){
   let backgroundQueue: dispatch_queue_t = dispatch_queue_create("SecondThread", DISPATCH_QUEUE_CONCURRENT)
   dispatch_async(backgroundQueue) {
      while self.started{
         for figure in FiguresManager.sharedInstance.figures{
            figure.1.calculateNextIterate()
         }
         usleep(40000)
      }
   }
}
.
.
.
метод в классе Figure

func calculateNextIterate(){
   dispatch_sync(dispatch_get_main_queue(), {
      self.setNeedsDisplay()
   })
}


Примерно так, я пытаюсь это сделать. Но фигуры не перерисовываются, хотя метод drawRect вызывается и параметры для отображения меняются. Буду очень признателен за помощь. Спасибо!
  • Вопрос задан
  • 307 просмотров
Решения вопроса 1
@YaMirok Автор вопроса
В общем, получилось следующее. Заменил
dispatch_sync(dispatch_get_main_queue()
на
dispatch_async(dispatch_get_main_queue()
и вроде как заработало. Но есть вероятность, что и до этого работало, просто изменение размера было несущественным =0.32 пункта, что на глаз незаметно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Flanker_4
@Flanker_4
Пока не все ясно. Большая просьба, дайте проект-пример с проблемой
P.S. Небольшая рекомендация, вот это usleep(40000) не очень круто. Лучше заведите таймер на GCD
Вот тут с ссылкой на оф. доку

dispatch_source_t CreateDispatchTimer(uint64_t interval, uint64_t leeway, dispatch_queue_t queue, dispatch_block_t block)
{
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    if (timer)
    {
        dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), interval, leeway);
        dispatch_source_set_event_handler(timer, block);
        dispatch_resume(timer);
    }
    return timer;
}


Использовать (только заменить queue на вашу)

dispatch_source_t newTimer = CreateDispatchTimer(1ull * NSEC_PER_SEC, (1ull * NSEC_PER_SEC) / 10, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // Repeating task
});
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы