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

@IBAction func translateButtonTapped(_ sender: UIButton) {
   guard CHHapticEngine.capabilitiesForHardware().supportsHaptics else {return}

let Bz1 = CHHapticEvent(eventType: .hapticContinuous, parameters: [], relativeTime: 0.0, duration: 0.1)
let Bz2 = CHHapticEvent(eventType: .hapticContinuous, parameters: [], relativeTime: 0.3, duration: 0.1)
let Bzz1 = CHHapticEvent(eventType: .hapticContinuous, parameters: [], relativeTime: 0.0, duration: 0.25)

let dictionary = [
"A" : [Bzz1],
"T" : [Bz1, Bz2],
]

let message = detectedTextLabel.text
//text box where string is written

let letterArray = message!.map { String($0) }

 for singleWord in letterArray {

    let word = String(singleWord)
    if let vibrationArray = dictionary[word] {

    do {

      for Word in vibrationArray {

           let encodedMessage = try CHHapticPattern(events: [Word], parameters: [])
           let player = try engine?.makePlayer(with: encodedMessage)
           try player?.start(atTime: 0)

    }
     } catch {
       print("there was an error")
     }

     } else {
      print("There was an error")
      }

 }

Пока этот код работает, если я набираю единичные буквы в текстовое поле. Однако, например, если я наберу «AT» в текстовом поле, вместо вибраций, воспроизводимых одна за другой, они оба будут воспроизводиться одновременно. Есть ли способ поместить некоторую задержку или паузу между шаблоном первой буквы и шаблоном второй буквы?

2
Guywithswift 12 Фев 2020 в 19:10

2 ответа

Лучший ответ

Я бы преобразовал его из цикла for ... in в традиционный цикл for в стиле C, чтобы вы могли отслеживать индексы. Затем, находясь внутри цикла for, вы можете заключить все в задержку DispatchQueue, основываясь на текущем индексе буквы, на которой вы находитесь. Что-то вроде этого.

for i in 0..<letterArray.count {
    DispatchQueue.main.asyncAfter(deadline: .now() + Double(i*1)) {
        // put current for loop code inside here
    }
}

Это просто предполагает задержку в 1 секунду. Вы также можете использовать enumerated () Swift, если хотите.

for (index, singleWord) in letterArray.enumerated() {
    DispatchQueue.main.asyncAfter(deadline: .now() + Double(index * 1)) {
        // put current for loop code inside here
    }
}
0
Kyle Johnson 12 Фев 2020 в 16:27

Использование таймера для задержки

Timer.scheduledTimer(withTimeInterval: 1, repeats: false) { _ in // Do your stuff here } 
1
Mac3n 12 Фев 2020 в 16:26