我想使我警告不要使用timer
而不使用_ = DispatchSource.createRepeating
变量,最好不要打印或以多余的方式使用它。
func testTimerIsStarted() {
let expectation = self.expectation(description: #function)
let timer = DispatchSource.createRepeating(interval: 0, deadline: DispatchTime.now()) {
expectation.fulfill()
}
waitForExpectations(timeout: 0.02)
}
从未使用过对不可变值'timer'的初始化; 考虑将其替换为“ _”或将其删除
不使用_
的原因是因为没有强大的参考,我的期望就无法实现,因为DispatchSource会立即发布而没有强大的参考。
DispatchSourceExtension
extension DispatchSource {
public static func createRepeating(interval: Double,
deadline: DispatchTime = .now(),
queue: DispatchQueue = .main,
mockTimer: DispatchSourceTimerScheduler? = nil,
handler: @escaping () -> Void) -> DispatchSourceTimerScheduler {
guard let timer = mockTimer ?? DispatchSource.makeTimerSource(queue: queue) as? DispatchSourceTimerScheduler else {
preconditionFailure("DispatchSourceTimer no longer complies with DispatchSourceTimerScheduler")
}
let leeway = estimateLeeway(for: interval)
timer.schedule(deadline: deadline, repeating: interval, leeway: leeway)
timer.setEventHandler(qos: .unspecified, flags: [], handler: handler)
timer.resume()
return timer
}
}
答案 0 :(得分:4)
我认为这是withExtendedLifetime(_:_:)
全局函数的用例。
func testTimerIsStarted() {
let expectation = self.expectation(description: #function)
let timer = DispatchSource.createRepeating(interval: 0, deadline: DispatchTime.now()) {
expectation.fulfill()
}
withExtendedLifetime(timer) { timer in
waitForExpectations(timeout: 0.02)
}
}
但是,总的来说,我不喜欢这种方法。这需要更多的精力,但是我认为这样的测试应该使用模拟时间,这样可以防止实际产生线程,等待“真实”时间过去等等。在执行此操作时,如果您在系统负载较高的时期执行单元测试(例如,并行运行测试,或者如果您正在启动其他进程),则测试将失败。因此,使用模拟时间更可靠,更不用说更快了。