我使用以下代码每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,我担心这是低效的。
有更好的方法吗?
答案 0 :(得分:1)
根据您在问题和评论中提出的要求,我认为使用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()
}
如果您在实施此问题时遇到任何问题,请与我们联系。随意建议编辑以使其更好:)