此代码不打印任何东西:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
QueueScheduler.main.schedule(after: Date() + 1.seconds,
interval: .seconds(1)){
print("test Output")}
return true
}
但是,如果我没有interval:
,它将按预期打印一次。为什么这样?
没有interval
的变化使用DispatchQueue.main.asyncAfter
并在执行操作之前检查处置。因此,除非您在返回的Disposable
上明确调用dispose
,否则该操作将进行。
但是interval
的变化使用DispatchSource.makeTimerSource
,然后在结果AnyDisposable
操作中捕获返回的DispatchSourceTimer
。由于DispatchSourceTimer
在发布时会取消自身,因此您必须存储返回的Disposable
否则deinits
并取消计时器。
我不知道这是故意的行为还是错误。一方面,这种类似命名的方法在这方面的作用有所不同,这有点令人困惑。但另一方面,如果您忘记处理Disposable
,则在间隔上重复的一个更容易泄漏,因此也许是有道理的。
更新:
这是一个错误,已固定在3.1.0中。