gpt4 book ai didi

swift - 计时器未触发(timeInterval 始终 == 0.0)

转载 作者:行者123 更新时间:2023-11-30 12:27:04 27 4
gpt4 key购买 nike

我在单例中创建了一个Timer,并且我一直在努力解决为什么Timer没有触发。我查看了这里的帖子,但没有找到我认为可以直接回答我的问题的帖子。

class ConnectionStateMonitor : NSObject {
static let shared = ConnectionStateMonitor()

var isConnected = false

fileprivate let reachability = Reachability()!
fileprivate var reconnectTimer: Timer?
fileprivate var reconnectPollInterval = TimeInterval(10.0)

func initialise() {
reachability.stopNotifier()

reachability.whenReachable = { reachability in

if reachability.isReachableViaWiFi {
Log.debug(message: "Reachable via WiFi")
} else {
Log.debug(message: "Reachable via Cellular")
}

self.updateConnectionState(isConnected: true)
}
reachability.whenUnreachable = { reachability in
Log.debug(message: "Not reachable")

self.updateConnectionState(isConnected: false)
}

do {
try reachability.startNotifier()
} catch {
//print("Unable to start notifier")
}
}

func updateConnectionState(isConnected: Bool) {
let wasConnected = self.isConnected

Log.debug(message: "Update connection state: \(isConnected)")

synchronize(lockObj: self, closure: {
self.isConnected = isConnected
})

self.updateReconnectTimer()
}

fileprivate func updateReconnectTimer() {
// Suspend any pending call.
self.reconnectTimer?.invalidate()

if !self.isConnected {
self.reconnectTimer = Timer.scheduledTimer(timeInterval: self.reconnectPollInterval, target: self, selector: #selector(ConnectionStateMonitor.attemptReconnect), userInfo: nil, repeats: false)
// Uncommenting below fires the timer.
//self.reconnectTimer?.fire()


print("attempting to reconnect in self.reconnectPollInterval = \(self.reconnectPollInterval) \(self.reconnectTimer?.timeInterval)s")
}
else {
self.reconnectTimer = nil
}
}

@objc func attemptReconnect() {
print("attempting to reconnect")

self.comms?.hello(completionHandler: { success, message in
self.updateReconnectTimer()
})
}
}

updateReconnectTimer 中的 print 语句打印出:

尝试在 self.reconnectPollInterval = 10.0Optional(0.0)s 内重新连接

我一生都无法弄清楚为什么当我明确将 Timer 的 timeInterval 属性设置为 10.0 时,它会变成 0.0。调用 fire 正确调用我的函数,因此我知道它已正确连接。

还要确认对 updateReconnectTimer 函数的后续调用不会造成干扰。

有什么明显的我遗漏的东西吗?

编辑:

我添加了更多代码来显示该问题,看来通过从 Reachability 更新完成处理程序中的 Timer (这将是一个后台线程)似乎可以防止Timer 触发。

最佳答案

不幸的是,该错误似乎与我在不同线程上更新 reconnectTimer 字段有关。强制它每次都在同一线程上更新可以纠正该问题。

关于swift - 计时器未触发(timeInterval 始终 == 0.0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44058145/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com