对于定时器相关的操作是否值得使用任何 QOS? 如果是,那么应该使用哪个线程或者我们可以使用哪个 QOS?
现在我正在创建一个计时器并将其添加到 Runloop:
var activityTimer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(self.runActivity), userInfo: nil, repeats: true)
RunLoop.current.add(activityTimer!, forMode: .common)
我用QOS创建了DispatchQueue的全局对象
.userInteractive
:
let queue = DispatchQueue(label: "com.example.timer", qos: .userInteractive)
我在这里向 API 发送数据:
@objc func runActivity () {
queue.async {
self.postDataUsingAPI()
}
}
那么这里应该使用哪种QOS比较合适呢?我希望所有这些活动只在后台运行。
我认为我们可以同意
userInteractive
是错误的,因为用户交互正是这段代码所不具备的。通过使用后台串行队列,您已经在说您并不真正关心此代码何时运行。计时器已经很接近了;也就是说,您也不会在确切的时间间隔内调用 runActivity
。另一方面,队列是串行的,因此您不会错过或重叠任何呼叫。最后,你将要联网,这意味着你已经放弃了所有快速响应的希望,因为你正在使用完全不可预测的网络。因此,.default
或 .utility
,或未指定,更为合适。
但我也会质疑您对后台队列的使用。计时器已经在后台有效运行。此外,网络本身已经在后台,您的队列不会以任何方式影响它。我认为你应该扔掉你的后台队列,让网络以通常的方式做它通常的工作。当你从网络获得回调时,你需要担心你在哪个队列上,这是你以完全不同的方式指定的东西。
对了,你的
RunLoop.current.add
错了。删除它。已为您将预定计时器添加到运行循环中;这正是scheduled
的意思.