定时器的多线程/QOS

问题描述 投票:0回答:1

对于定时器相关的操作是否值得使用任何 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比较合适呢?我希望所有这些活动只在后台运行。

swift grand-central-dispatch dispatch-queue
1个回答
2
投票

我认为我们可以同意

userInteractive
是错误的,因为用户交互正是这段代码所不具备的。通过使用后台串行队列,您已经在说您并不真正关心此代码何时运行。计时器已经很接近了;也就是说,您也不会在确切的时间间隔内调用
runActivity
。另一方面,队列是串行的,因此您不会错过或重叠任何呼叫。最后,你将要联网,这意味着你已经放弃了所有快速响应的希望,因为你正在使用完全不可预测的网络。因此,
.default
.utility
,或未指定,更为合适。

但我也会质疑您对后台队列的使用。计时器已经在后台有效运行。此外,网络本身已经在后台,您的队列不会以任何方式影响它。我认为你应该扔掉你的后台队列,让网络以通常的方式做它通常的工作。当你从网络获得回调时,你需要担心你在哪个队列上,这是你以完全不同的方式指定的东西。

对了,你的

RunLoop.current.add
错了。删除它。已为您将预定计时器添加到运行循环中;这正是
scheduled
的意思.

© www.soinside.com 2019 - 2024. All rights reserved.