Ios 如何在网络状态更改时停止对swift 3中方法的多次调用?

Ios 如何在网络状态更改时停止对swift 3中方法的多次调用?,ios,swift,swift3,Ios,Swift,Swift3,我希望每次网络状态更改只执行一次callFormDataPushOnBackground方法。但现在,每当网络状态更改为联机时,由于侦听器的原因,可以多次拨打电话。 如何只允许一个呼叫而放弃其余呼叫?我尝试使用listenerQueue.asyncAfter,但它不起作用 谢谢你的帮助 func rechability()->(Isconected:Bool,status:Error?){ var conectivity:Bool = false var statusEr

我希望每次网络状态更改只执行一次callFormDataPushOnBackground方法。但现在,每当网络状态更改为联机时,由于侦听器的原因,可以多次拨打电话。 如何只允许一个呼叫而放弃其余呼叫?我尝试使用listenerQueue.asyncAfter,但它不起作用

谢谢你的帮助

func rechability()->(Isconected:Bool,status:Error?){

    var conectivity:Bool = false
    var statusError:Error?

    var offlinePushFlag = true
    manager?.listener = { status in

        switch status {

        case .notReachable:

            conectivity = false
            statusError = typeError.eNotRechable
            offlinePushFlag = true
            self.updatetheSyncLable()
            print("The network is not reachable")

        case .unknown :

            statusError = typeError.eUnknown
            conectivity = false
            offlinePushFlag = true
            self.updatetheSyncLable()

            print("It is unknown whether the network is reachable")

        case .reachable(.ethernetOrWiFi):

            statusError = typeError.eRechable
            conectivity = true
            self.updatetheSyncLable()
            var x = 1

            self.manager?.listenerQueue.asyncAfter(deadline: .now() +  .milliseconds(10000 * x + 2), execute: {
                x = x + 1
                if offlinePushFlag == true{
                    offlinePushFlag = false
                    print("I calledonlyoneTimeWIFI")
                    self.callFormDataPushOnBackground()

                }
            })

            print("The network is reachable over the WiFi connection")

        case .reachable(.wwan):

            statusError = typeError.eWanRechable
            conectivity = true
            self.updatetheSyncLable()
            if offlinePushFlag == true{
                print("I calledonlyoneTimeWWAN")
                offlinePushFlag = false
                self.callFormDataPushOnBackground()
            }
            print("The network is reachable over the WWAN connection")

        }
    }

    manager?.startListening()



    return (conectivity,statusError)
}

如果我理解正确,您可以使用DispatchSemaphore来确保一个调用在下一个调用开始之前完成

let semaphore = DispatchSemaphore(value:1)
manager?.listener = { status in
    // some code
    // you completed your work here
    self.semaphore.signal()
}
注意,你应该小心不要阻塞主队列,因为这会导致你的应用程序没有响应

比如:


如何丢弃剩下的?我只允许每个网络状态更改一次呼叫。我没有收到您的问题。所有其他调用都将被丢弃,只有一个调用将在您在信号量上调用sygnal之前运行
let analyticsQueue = DispatchQueue(label:"analyticsQueue")

let semaphore = DispatchSemaphore(value:1)


manager?.listener = { status in
    analyticsQueue.async {
        self.semaphore.wait()
        // code here
        self.semaphore.sygnal()
    }
}