iOS (Swift): создание живой кнопки Flash с DispatchQueue.main.asyncAfter - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь зажечь кучу ярких UIButton экземпляров подкласса, вызывая метод flash(), заданный следующим образом:

func flash(delay: TimeInterval = 0.0) {
    DispatchQueue.main.asyncAfter(deadline: .now() + delay)  { [weak self] in
        guard let strongSelf = self else { return }
        let flashView = UIView(frame: strongSelf.bounds)
        strongSelf.insertSubview(flashView, at: 0)
        flashView.backgroundColor = strongSelf.color
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { flashView.removeFromSuperview() }
    }
}

Используя эту функцию, я могу выполнить цикл для массивакнопки, запускающие эффект вспышки, который длится в течение 0,1 секунды с миганием, вызванным вибрирующим слоем, изменяющим экземпляр flashView позади него.

Есть ли у этой функции какие-либо недостатки, вызывая DispatchQueue.main.asyncAfter в вызове DispatchQueue.main.asyncAfter

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Не вижу проблем с вложенными вызовами на DispatchQueue.main.asyncAfter().Однако каждый вызов вашей флеш-функции создает и добавляет новое подпредставление в ваше представление.Это создаст постоянно увеличивающийся стек подпредставлений, которые будут накапливаться по мере запуска анимации (что приведет к медленному использованию вашей памяти до тех пор, пока вы не освободите представления кнопок.

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

0 голосов
/ 24 декабря 2018

Нет, здесь нет необходимости: [weak self], поскольку этот GCD (Grand Central Dispatch) не вызывает циклов сохранения

DispatchQueue.main.asyncAfter(deadline: .now() + delay)  { /*[weak self] in */

Проверьте последний раздел Здесь

...