设置间隔时 QueueScheduler 不触发
QueueScheduler not firing when interval is set
此代码不打印任何内容:
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:
的情况下这样做,它会按预期打印一次。为什么这样?
The variation without interval
is using DispatchQueue.main.asyncAfter
并在执行操作前检查处置情况。因此该操作将 运行 除非您在返回的 Disposable
.
上显式调用 dispose
但是the variation with interval
is using DispatchSource.makeTimerSource
and then capturing the returned DispatchSourceTimer
in the resulting AnyDisposable
action。由于 DispatchSourceTimer
在释放时自行取消,您必须存储返回的 Disposable
否则它 deinits
并且计时器被取消。
我不知道这是故意行为还是错误。一方面,这种名称相似的方法在这方面的行为不同,这有点令人困惑。但另一方面,如果您忘记处理 Disposable
它 returns,那么按间隔重复的 更 更容易泄漏,所以也许它使感觉。
更新:
这是一个错误 fixed in 3.1.0。
此代码不打印任何内容:
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:
的情况下这样做,它会按预期打印一次。为什么这样?
The variation without interval
is using DispatchQueue.main.asyncAfter
并在执行操作前检查处置情况。因此该操作将 运行 除非您在返回的 Disposable
.
dispose
但是the variation with interval
is using DispatchSource.makeTimerSource
and then capturing the returned DispatchSourceTimer
in the resulting AnyDisposable
action。由于 DispatchSourceTimer
在释放时自行取消,您必须存储返回的 Disposable
否则它 deinits
并且计时器被取消。
我不知道这是故意行为还是错误。一方面,这种名称相似的方法在这方面的行为不同,这有点令人困惑。但另一方面,如果您忘记处理 Disposable
它 returns,那么按间隔重复的 更 更容易泄漏,所以也许它使感觉。
更新:
这是一个错误 fixed in 3.1.0。