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:会按预期打印一次。为什么这样?

4

1 回答 1

1

没有的变化interval是在执行操作之前使用DispatchQueue.main.asyncAfter和检查处置。因此,除非您明确调用dispose返回的Disposable.

但是变体interval是使用DispatchSource.makeTimerSource然后捕获结果中返回DispatchSourceTimerAnyDisposableaction。由于DispatchSourceTimer在释放时会自行取消,因此您必须存储返回的值Disposable,否则会deinits取消计时器。

我不知道这是故意行为还是错误。一方面,这种类似命名的方法在这方面表现不同,这有点令人困惑。但另一方面,如果您忘记处理它返回的时间间隔,那么在某个时间间隔重复的内容容易泄漏Disposable,所以也许这是有道理的。

更新:

这是一个错误,已在 3.1.0 中修复

于 2017-12-26T13:44:31.310 回答