我继承了一个在
view
结构体中创建 SwiftUI 计时器的代码,如下所示。
struct CustomButton: View {
...
private let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
...
一旦实现预期触发并完成工作,就看不到任何取消计时器的代码。 但查看下面的指南,我发现建议使用
timer.upstream.connect().cancel()
取消计时器
我的问题是取消这个计时器有多重要,到目前为止我没有看到团队面临任何问题,但这是否会导致任何类型的问题?或者如果视图被释放,计时器也会被释放,所以这并不那么重要?
参考:https://www.hackingwithswift.com/books/ios-swiftui/triggering-events-repeatedly-using-a-timer
let timer = Timer...
实际上对于 SwiftUI 来说并不是一个好的实践,你最终可能会出现内存泄漏,因为 SwiftUI 可以随时重新创建视图并创建多个计时器。
处理动画的“最佳”方法就是使用
TimelineView
TimelineView(.periodic(from: startDate, by: 1)) { context in
AnalogTimerView(date: context.date)
}
https://developer.apple.com/documentation/swiftui/timelineview
但是如果你必须使用
Timer
,你应该将它与onReceive
一起使用,这样它就会被适当地销毁。
.onReceive(Timer.publish(every: 1, on: .main, in: .common).autoconnect()) { output in
print("Timer called")
}