У меня есть простое приложение, которое предназначено для работы следующим образом:
- Приложение загружается с изображением по умолчанию
- После получения крана случайное изображение загружается из списка
- Если в течение 5 секунд не будет получено касание, мы вернемся к изображению по умолчанию
Я пытаюсь выполнить sh, используя DispatchQueue и DispatchWorkItem. Мне удалось заставить работать вышеуказанную функциональность - , за исключением случаев, когда пользователь нажимает несколько раз .
Я предполагаю, что это потому, что мы запускаем DispatchWorkItem с возвратом в исходное состояние каждый раз, когда мы нажимаем без сброса 5 секунд.
Как сбросить изображение обратно к изображению по умолчанию, если в течение 5 секунд не было получено касание при сбросе DispatchQueue?
Здесь это то, что я имею до сих пор:
import SwiftUI
struct PlayView : View {
@ObservedObject var viewRouter: ViewRouter
@State var imageName : String = "smiley"
var body: some View {
ZStack {
Color.black
.edgesIgnoringSafeArea(.all)
Image(imageName)
}
.gesture(
TapGesture()
.onEnded {
let resetToOff = DispatchWorkItem {
self.imageName = "smiley"
}
self.changeImage()
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(5), execute: resetToOff)
}
)
// Activate the options menu
.onLongPressGesture(minimumDuration: 3) {
self.viewRouter.currentPage = "menuView"
}
}
func changeImage() {
let tempImageName : String = self.imageName
let list : Array = [
"smileyPink",
"smileyGreen",
"smileyRed",
"smileyBlue",
"smileyYellow"
]
self.imageName = list.randomElement() ?? ""
// Ensure that new image selection is not the same as previous image
while tempImageName == self.imageName {
self.imageName = list.randomElement() ?? ""
}
}
}
struct PlayView_Previews : PreviewProvider {
static var previews: some View {
PlayView(viewRouter: ViewRouter())
}
}
Любая помощь с этим будет высоко ценится.