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