Каков наилучший способ запланировать повторную задачу с очень строгим сроком (точный и надежный для музыкального секвенирования)? Из документов Apple ясно, что NSTimer не является надежным в этом смысле (т. Е. «Таймер не является механизмом реального времени»). Подход, который я позаимствовал из AudioKit-х AKPlaygroundLoop кажется последовательным в течение примерно 4 мс (если не совсем точно), и может быть целесообразным:Строго запланированное время цикла в быстром
class JHLoop: NSObject{
var trigger: Int {
return Int(60 * duration) // 60fps * t in seconds
}
var counter: Int = 0
var duration: Double = 1.0 // in seconds, but actual loop is ~1.017s
var displayLink: CADisplayLink?
weak var delegate: JHLoopDelegate?
init(dur: Double) {
duration = dur
}
func stopLoop() {
displayLink?.invalidate()
}
func startLoop() {
counter = 0
displayLink = CADisplayLink(target: self, selector: "update")
displayLink?.frameInterval = 1
displayLink?.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes)
}
func update() {
if counter < trigger {
counter++
} else {
counter = 0
// execute loop here
NSLog("loop executed")
delegate!.loopBody()
}
}
}
protocol JHLoopDelegate: class {
func loopBody()
}
(Для справки, я надеюсь сделать многоритмичные барабан секвенсор таким образом, согласованность является самым важным , Я также должен иметь возможность плавно модифицировать цикл, а в идеале - период цикла, в реальном времени)
Есть ли лучший способ сделать это? Любое руководство будет высоко оценено.
(Edit: Заменены код с фактическим классом я буду стараться использовать в настоящее время)
Это очень полезно, как код, так и особенно ссылка mach_absoloute_time. –