Ios 我不能停止计时
我正在像这样创建计时器和循环Ios 我不能停止计时,ios,iphone,swift,swift3,ios10,Ios,Iphone,Swift,Swift3,Ios10,我正在像这样创建计时器和循环 private var iteration:Int = 0 private var syncTimer:Timer? = Timer() //MARK: - Singleton static let synchronizationInstance:DeviceSynchronization = DeviceSynchronization() private init(){ } public func synchronizeAllDevices(){
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
应该停止,但什么也没有发生。计时器仍然工作。我不知道这里有bug。我的同步代码在应用程序连接到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秒钟后,我尝试同步列表中的所有设备(对象)。
我发现这个事件被触发了两次,我不知道为什么,但这在singleton中创建了两个计时器
解决了!
我的问题是Stream.Event.openCompleted触发了两次,这就是为什么我的同步类创建了两个计时器。。。
我通过创建一个真/假变量“isSyncIsInProgress”解决了这个问题。您可能会在代码中的某个地方再次被称为
synchronizeAllDevices
,。invalidate()
应该可以很好地工作。就我测试了上面显示的代码(我需要移动一个不平衡的右括号),您的代码工作正常。正如Tj3n所建议的,您在隐藏的某个地方有一些错误。我不确定类DeviceSynchronization的实现在哪里,但乍一看,#选择器(DeviceSynchronization.synchronizeDevices)
应该是这样的:#选择器(DeviceSynchronization.synchronizationInstance.synchronizeDevices)
;但不清楚此代码段是否来自/在实际DeviceSynchronization类中。我将#选择器(DeviceSynchronization.synchronizationInstance.synchronizeDevices)更改为#选择器(DeviceSynchronization.synchronizationInstance.synchronizeDevices)但是它仍然不起作用。@WujoFefer,您可能需要发布已完成的实现以了解整个情况,因为在我的测试类中,您的代码工作正常,计时器在第7次迭代后停止;但在我的测试类中,您的所有代码(按原样)在DeviceSynchronization
类的实现中;但是该类在屏幕上的外观并不清楚。