我每0.1秒移动1米地图标记,代码如下:
for index in 1 ... points.count - 1 {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1 * Double(index)) {
self.driverMarker.position = points[index]
self.driverMarker.map = self.mapView
}
}
如果所有点的距离都是3000米,那么我设置了3000个asyncAfters,我担心这是低效的。
有更好的办法吗?
最佳答案
根据您在问题和评论中提出的要求,我认为使用DispatchSourceTimer
更适合此任务。我提供了一个样本代码供参考。
var count = 0
var bgTimer: DispatchSourceTimer?
func translateMarker() {
if count == (points.count - 1) {
bgTimer?.cancel()
bgTimer = nil
return
}
self.driverMarker.position = points[index]
self.driverMarker.map = self.mapView
count += 1
}
override func viewDidLoad() {
super.viewDidLoad()
let queue:DispatchQueue = DispatchQueue.global(qos: DispatchQoS.QoSClass.default)
bgTimer = DispatchSource.makeTimerSource(flags: [], queue: queue)
bgTimer?.scheduleRepeating(deadline: DispatchTime.now(), interval: 0.1)
bgTimer?.setEventHandler(handler: {
self.translateMarker()
})
bgTimer?.resume()
}
请让我知道,如果你在执行中遇到任何问题。请随意提出修改建议,以使其更好:)