如何使用 Swift 3 DispatchQueue 高效调度数千个异步事件
How to Efficiently Schedule Thousands of Async Events Using Swift 3 DispatchQueue
我使用以下代码每 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()
}
如果您在实施过程中遇到任何问题,请告诉我。随时提出修改建议,使它变得更好:)
我使用以下代码每 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()
}
如果您在实施过程中遇到任何问题,请告诉我。随时提出修改建议,使它变得更好:)