Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我不能停止计时_Ios_Iphone_Swift_Swift3_Ios10 - Fatal编程技术网

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
类的实现中;但是该类在屏幕上的外观并不清楚。