问题在于所讨论的完成块可能未在主线程上运行,因此没有运行循环。但是计时器需要在运行循环中进行调度,而主线程只有一个,而大多数后台线程则没有(除非您自己添加一个)。
为了解决这个问题,在该完成处理程序中,将计时器的创建分派回主线程,并且应该可以正常工作:
DispatchQueue.main.async { self.timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(handleTimer(_:)), userInfo: nil, repeats: true)}或使用调度源计时器(可以为后台队列安排的计时器,并且不需要运行循环)。
var timer: DispatchSourceTimer!private func startTimer() { let queue = DispatchQueue(label: "com.domain.app.timer") timer = DispatchSource.makeTimerSource(queue: queue) timer.setEventHandler { [weak self] in // do something } timer.schedule(deadline: .now(), repeating: 1.0) timer.resume()}


