几秒钟后如何停止计时器
How to stop Timer after few seconds
这里的 myAPICall()
方法正在调用另一个方法,即每 5 秒调用一次 COStatusAPI()
,最多 90 秒。
这里COStatusAPI()
是一个API调用。即,我每 5 秒访问一次服务器。作为回应,我将得到 COStatus 为 1 或 0。
如果我得到 COStatus 为 1,我将停止计时器并导航到另一个 viewController
和
如果我在 90 秒内将 COStatus 设为 0。我正在停止计时器并显示警报。
但我的问题是计时器没有停止。比如,如果我得到 COStatus 为 1,在后台计时器中是 运行。所以,90 秒后我收到了警报消息。
以同样的方式直到90秒。如果我得到 COStatus 为 0 表示正在显示警报。此警报不断重复。
如何实现?谁能帮我解决这个问题
var myTimer : Timer?
var timeController : Bool = true
func myAPICall(){
self.loadingview()
if self.myTimer == nil {
self.myTimer = Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(self.COStatusAPI), userInfo: nil, repeats: self.timeController)
}
}
@objc func COStatusAPI(){
if COStatus == 0{
self.timeController = true
let when = DispatchTime.now() + 90
DispatchQueue.main.asyncAfter(deadline: when) {
self.timeController = false
if self.acceptOrRejectTimer != nil {
self.acceptOrRejectTimer!.invalidate()
self.acceptOrRejectTimer = nil
}
self.hideloadingView()
//showing alert
}
}
if COStatus == 1{
self.timeController = false
if self.acceptOrRejectTimer != nil {
self.acceptOrRejectTimer!.invalidate()
self.acceptOrRejectTimer = nil
}
self.hideloadingview()
//navigating to next view controller
}
}
- 忘记
DispatchQueue.main.asyncAfter
.
- 创建一个值为 18 的
Int
计数器 属性。
- 在
COStatusAPI()
中进行 API 调用。
- 如果
COStatus == 1
invalidate()
定时器并转到下一个控制器。
- 其他
- 递减计数器。
- 如果计数器达到 0
invalidate()
计时器并显示警报。
var myTimer : Timer?
var counter = 0
func myAPICall(){
self.loadingview()
if self.myTimer == nil {
counter = 18
self.myTimer = Timer.scheduledTimer(timeInterval: 5.0,
target: self,
selector: #selector(COStatusAPI),
userInfo: nil,
repeats: true)
}
}
@objc func COStatusAPI(_ timer: Timer) {
// call API
switch COStatus {
case 0:
counter -= 1
if counter == 0 {
timer.invalidate()
self.myTimer = nil
//showing alert
}
case 1:
timer.invalidate()
self.myTimer = nil
//navigating to next view controller
default: break
}
}
这里的 myAPICall()
方法正在调用另一个方法,即每 5 秒调用一次 COStatusAPI()
,最多 90 秒。
这里COStatusAPI()
是一个API调用。即,我每 5 秒访问一次服务器。作为回应,我将得到 COStatus 为 1 或 0。
如果我得到 COStatus 为 1,我将停止计时器并导航到另一个 viewController 和 如果我在 90 秒内将 COStatus 设为 0。我正在停止计时器并显示警报。
但我的问题是计时器没有停止。比如,如果我得到 COStatus 为 1,在后台计时器中是 运行。所以,90 秒后我收到了警报消息。
以同样的方式直到90秒。如果我得到 COStatus 为 0 表示正在显示警报。此警报不断重复。
如何实现?谁能帮我解决这个问题
var myTimer : Timer?
var timeController : Bool = true
func myAPICall(){
self.loadingview()
if self.myTimer == nil {
self.myTimer = Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(self.COStatusAPI), userInfo: nil, repeats: self.timeController)
}
}
@objc func COStatusAPI(){
if COStatus == 0{
self.timeController = true
let when = DispatchTime.now() + 90
DispatchQueue.main.asyncAfter(deadline: when) {
self.timeController = false
if self.acceptOrRejectTimer != nil {
self.acceptOrRejectTimer!.invalidate()
self.acceptOrRejectTimer = nil
}
self.hideloadingView()
//showing alert
}
}
if COStatus == 1{
self.timeController = false
if self.acceptOrRejectTimer != nil {
self.acceptOrRejectTimer!.invalidate()
self.acceptOrRejectTimer = nil
}
self.hideloadingview()
//navigating to next view controller
}
}
- 忘记
DispatchQueue.main.asyncAfter
. - 创建一个值为 18 的
Int
计数器 属性。 - 在
COStatusAPI()
中进行 API 调用。 - 如果
COStatus == 1
invalidate()
定时器并转到下一个控制器。
- 其他
- 递减计数器。
- 如果计数器达到 0
invalidate()
计时器并显示警报。
var myTimer : Timer?
var counter = 0
func myAPICall(){
self.loadingview()
if self.myTimer == nil {
counter = 18
self.myTimer = Timer.scheduledTimer(timeInterval: 5.0,
target: self,
selector: #selector(COStatusAPI),
userInfo: nil,
repeats: true)
}
}
@objc func COStatusAPI(_ timer: Timer) {
// call API
switch COStatus {
case 0:
counter -= 1
if counter == 0 {
timer.invalidate()
self.myTimer = nil
//showing alert
}
case 1:
timer.invalidate()
self.myTimer = nil
//navigating to next view controller
default: break
}
}