我正在像这样创建计时器和循环。
private var iteration:Int = 0
private var syncTimer:Timer? = Timer()
//MARK: - Singleton
static let synchronizationInstance:DeviceSynchronization = DeviceSynchronization()
private init(){
}
public func synchronizeAllDevices(){
let when = DispatchTime.now() + 2
DispatchQueue.main.asyncAfter(deadline: when) {
self.syncTimer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(DeviceSynchronization.synchronizeDevices), userInfo: nil, repeats: true)
self.syncTimer?.fire()
}
}
}
@objc private func synchronizeDevices(){
if iteration >= 7 {
syncTimer?.invalidate()
syncTimer = nil
iteration = 0
} else {
devicesList![iteration].synchroniseState()
iteration += 1
}
}
当达到七次时,syncTimer?.invalidate()
和 syncTimer = nil
应该停止 syncTimer
,但什么也不会发生。计时器仍然有效。我不知道这是错误。
最佳答案
当应用程序在 Stream.Event.openCompleted 中连接到服务器时,我的同步代码开始。
internal func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
switch eventCode {
case Stream.Event.openCompleted:
log.info("The open has completed successfully.")
reconnectCount = 0
syncAllDevices.synchronizeAllDevices()
break
case Stream.Event.hasSpaceAvailable:
log.info("The stream can accept bytes for writing.")
break
case Stream.Event.hasBytesAvailable:
receveData()
break
case Stream.Event.errorOccurred:
log.info("An error has occurred on the stream.")
break
reconnect()
case Stream.Event.endEncountered:
log.info("The end of the stream has been reached.")
break
default:
log.info(„Unknown error”)
break
}
}
2 秒后,我尝试同步列表中的所有设备(对象)。 我发现这个事件被触发了两次,我不知道为什么,但这在单例中创建了 2 个计时器......
解决了! 我的问题是当 Stream.Event.openCompleted 触发两次时,这就是为什么我的同步类创建两个计时器...... 我通过创建一个真/假变量“isSyncIsInProgress”解决了这个问题。
关于ios - 我无法停止计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41545277/