静止画をビデオに変換する処理で、callbackの中で Timerが発火しない

通常、Timerを発火する場合は:

func timerStart() {
  let timer = Timer.scheduledTimer(timeInterval: 0.1,
  target: self, selector: #selector(self.onTimer), userInfo: nil, repeats: true)
  RunLoop.main.add(timer, forMode: RunLoopMode.commonModes)
}

func main() {
  self.timerStart()
}

func onTimer {
  // call every 100ms interval.
}

これは、動作する

func timerStart() {
  let timer = Timer.scheduledTimer(timeInterval: 0.1,
  target: self, selector: #selector(self.onTimer), userInfo: nil, repeats: true)
  RunLoop.main.add(timer, forMode: RunLoopMode.commonModes)
}

func main() {

  //
  assetWriter.finishWriting(completionHandler: {
    self.timerStart()
  }
}

func onTimer {
  // call every 100ms interval.
}

なんらかのコールバック(この場合は、ビデオの変換処理後のコールバック)の中では、Timerが開始されない

func timerStart() {
  let timer = Timer.scheduledTimer(timeInterval: 0.1,
  target: self, selector: #selector(self.onTimer), userInfo: nil, repeats: true)
  RunLoop.main.add(timer, forMode: RunLoopMode.commonModes)
}

func main() {

  //
  assetWriter.finishWriting(completionHandler: {
    DispatchQueue.main.async {
      self.timerStart()
    }
  }
}

func onTimer {
  // call every 100ms interval.
}

一旦、メインスレッドに処理を渡せば動作する