gpt4 book ai didi

ios - DispatchQueue.main.asyncAfter 带开/关开关

转载 作者:搜寻专家 更新时间:2023-11-01 06:11:41 33 4
gpt4 key购买 nike

我提出了以下结构,作为在网络连接速度较慢时提醒用户的一种方式。

当函数要调用服务器时,它会创建一个 ResponseTimer。这会设置延迟通知,仅当 responseTimer var isOn = true 时才会触发。当我的函数从服务器获得响应时,设置 responseTimer.isOn = false。

结构如下:

struct ResponseTimer {

var isOn: Bool

init() {
self.isOn = true
self.setDelayedAlert()
}

func setDelayedAlert() {
let timer = DispatchTime.now() + 8
DispatchQueue.main.asyncAfter(deadline: timer) {
if self.isOn {
NotificationCenter.default.post(name: NSNotification.Name(rawValue: toastErrorNotificationKey), object: self, userInfo: ["toastErrorCase" : ToastErrorCase.poorConnection])
}
}
}

下面是我将如何使用它

func getSomethingFromFirebase() {

var responseTimer = ResponseTimer()

ref.observeSingleEvent(of: .value, with: { snapshot in
responseTimer.isOn = false

//do other stuff
})
}

即使在 8 秒延迟完成之前响应返回,通知仍会触发。我在这里做错了什么???有没有更好的模式可以用于这样的事情?

感谢您的帮助!

最佳答案

更好的方法是使用可以取消的DispatchSourceTimer

var timer : DispatchSourceTimer?

func startTimer()
{
if timer == nil {
timer = DispatchSource.makeTimerSource(queue: DispatchQueue.global())
timer!.schedule(deadline: .now() + .seconds(8))
timer!.setEventHandler {
DispatchQueue.main.async {
NotificationCenter.default.post(name: NSNotification.Name(rawValue: toastErrorNotificationKey), object: self, userInfo: ["toastErrorCase" : ToastErrorCase.poorConnection])
}
self.timer = nil
}
timer!.resume()
}
}

func getSomethingFromFirebase() {

startTimer()

ref.observeSingleEvent(of: .value, with: { snapshot in
self.timer?.cancel()
self.timer = nil
//do other stuff
})
}

关于ios - DispatchQueue.main.asyncAfter 带开/关开关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55080035/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com