我已经使用DispatchSourceTimer制作了一个计时器,如下所示:

class Timer: : NSObject, ObservableObject {
    @Published var counterTime: Int = 0
    var timer: DispatchSourceTimer?
    
    func startTimer() {
        let queue = DispatchQueue(label: "com.app.watchkitapp", qos: .userInteractive)
        timer = DispatchSource.makeTimerSource(flags: .strict, queue: queue) <--- Xcode point out the error at this line
        timer?.schedule(deadline: .now(), repeating: 1)
        timer?.setEventHandler {
            DispatchQueue.main.async {
                self.counterTime += 1
            }
        }
        timer?.resume()
    }

    func stopTimer() {
        timer?.suspend()
    }

    func resetTimer() {
        timer?.cancel()
        self.counterTime = 0
    }
}

但每次我try 执行"stopTimer()"函数(以停止计时器)时,我都会遇到这个错误:

Thread 1: EXC_BREAKPOINT (code=1, subcode=0x102f34210)

顺便说一句,我想做一个计时器,可以开始,暂停和重置在watchos.谢谢大家!

推荐答案

我在堆栈跟踪中看到了这个错误,文档也提到了这一点.

libdispatch.dylib`:
    0x10274521c <+0>:  mov    x8, x0
    0x102745220 <+4>:  stp    x20, x21, [sp, #-0x10]!
    0x102745224 <+8>:  adrp   x20, 6
    0x102745228 <+12>: add    x20, x20, #0x650          ; "BUG IN CLIENT OF LIBDISPATCH: Release of a suspended object"
    0x10274522c <+16>: adrp   x21, 40
    0x102745230 <+20>: add    x21, x21, #0x228          ; gCRAnnotations
    0x102745234 <+24>: str    x20, [x21, #0x8]
    0x102745238 <+28>: str    x8, [x21, #0x38]
    0x10274523c <+32>: ldp    x20, x21, [sp], #0x10
->  0x102745240 <+36>: brk    #0x1

释放当前挂起的对象是程序员的错误,因为挂起意味着仍有工作要做.因此,在释放对象之前,始终要平衡对此方法的调用和对DISPATCH_RESUME的相应调用.在调度对象处于挂起状态时释放对该调度对象的最后一个引用时的行为是未定义的.

我认为您不允许以这种方式发布DISTER_SOURCE.你可以像这样改变它.我还建议在每次startstop的时候验证计时器的存在,以避免多次初始化.

func startTimer() {
    guard timer == nil else { return }
    ...
}

func stopTimer() {
    timer?.cancel()
    timer = nil
}

你可能想看看这个answer.

Swift相关问答推荐

SwiftUI状态更新

MyApp类型不符合协议App''''

在运行时检测蒸汽工人的类型

如何将EnvironmentObject从UIKit视图控制器传递到SwiftUI视图

SwiftUI map 旋转

声明一个协议时使用和不使用任何单词有什么区别?

在数组中查找最大y值的x值

Swift 运算符中 inout 的行为

如何在 swiftui 中设置给定字符串类型日期的日期倒计时?

覆盖一个子元素的 HStack 对齐方式

使用 Async-Await 和 Vapor-Fluent 创建 CRUD 函数 - Swift 5.6

快速更改tableView中的数据

在主要参与者中启动分离任务和调用非隔离函数之间的区别

响应 UITextField (UIViewRepresentable) 中的特定按键

如何在 Swift 中将 XPC 自定义类列入白名单?

在 Swift 中将两个字节的 UInt8 数组转换为 UInt16

在 Swift 中返回实例类型

Swift:在子类中覆盖 == 导致仅在超类中调用 ==

UITableViewCell 不显示 detailTextLabel.text - Swift

如何在Swift中找出字母是字母数字还是数字