Определенная функция запускается в одно и то же время для всех представлений.Как я могу заставить его работать один за другим? - PullRequest
2 голосов
/ 30 июня 2019

Я создаю приложение Simon Says, используя SwiftUI, и когда я создавал его, я столкнулся с ошибкой. Проблема с одной конкретной функцией, которую я набрал ниже. Эта функция устанавливает альфа-значения кнопок Simon Says (простая анимация нажатия кнопки) и устанавливает их обратно на 0,5. Я хочу, чтобы это запускалось по одному в каждом из представлений, потому что пока анимация запускается на всех кнопках одновременно.

Вся помощь будет оценена!

for index in settings.guessArray {
            wait(time: 2.0) {
                settings.alphas[index] = 1.0
                wait(time: 0.3) {
                    settings.alphas[index] = 0.5
                }
            }
        }

Ответы [ 2 ]

1 голос
/ 30 июня 2019

Может быть, что-то вроде этого будет работать ...

Ожидания выполняются асинхронно, поэтому увеличьте начальное время ожидания для каждой кнопки, чтобы расположить их во времени:

var offset = 0.0
for index in settings.guessArray {
    wait(time: 2.0 + offset) {
        settings.alphas[index] = 1.0
        wait(time: 0.3) {
            settings.alphas[index] = 0.5
        }
    }

    // increase this value to increase the spacing between the buttons
    // lighting up
    offset += 0.3
}

//if you're using this function on multiple SwiftUI views at the same time
//consider placing the offset variable in @EnvironmentObject.
0 голосов
/ 30 июня 2019

Я здесь летаю вслепую, но чего вы добились с помощью семафора. Адаптировать из кода ниже:

let semaphore = DispatchSemaphore(value: 0)

for index in settings.guessArray {
    semaphore.wait() // When animation on one button begins
    wait(time: 2.0) {
        settings.alphas[index] = 1.0
        wait(time: 0.3) {
            settings.alphas[index] = 0.5
            semaphore.signal() // When animation on a button finishes
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...