Есть ли способ включить синхронизированные паузы при цикле через массив? - PullRequest
2 голосов
/ 12 февраля 2020

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

@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 ]

1 голос
/ 12 февраля 2020

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

Timer.scheduledTimer(withTimeInterval: 1, repeats: false) { _ in // Do your stuff here } 
0 голосов
/ 12 февраля 2020

Я бы преобразовал его из for ... in l oop в традиционный C стиль для l oop, чтобы вы могли отслеживать индексы. Затем, находясь внутри для l oop, вы можете заключить все в задержку 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...