ios - 在 iOS 项目中使用 schedule()

标签 ios timer schedule

我正在尝试在 iOS 项目上使用 schedule(deadline:repeating:leeway:)。在对应的 macOS 项目中它工作正常,但在 iOS 项目中我得到一个错误:

'schedule(deadline:repeating:leeway:)' is unavailable

部分代码如下:

var timeoutTimer : DispatchSourceTimer?

func startUpdateTimer(){
        let delay : DispatchTime = .now() + .seconds(3)

        if timeoutTimer == nil {
            timeoutTimer = DispatchSource.makeTimerSource()
            timeoutTimer!.schedule(deadline: delay, repeating: 0) // Error: 'schedule(deadline:repeating:leeway:)' is unavailable
        ...

文档 1: https://developer.apple.com/documentation/dispatch/dispatchsourcetimer/2920395-schedule

我想知道如果我做错了什么,有人可以告诉我这段代码是否可以在 iOS 上运行吗?

附言 使用不推荐使用的 scheduleRepeating(deadline:interval:leeway:) 而不是 schedule(deadline:repeating:leeway:) 似乎有效。不幸的是,目前我没有足够的知识来理解这两种说法有何不同。

timeoutTimer!.scheduleRepeating(deadline: delay, interval: 0)

文档 2:https://developer.apple.com/documentation/dispatch/dispatchsourcetimer/2016072-schedulerepeating

最佳答案

scheduleRepeating(deadline:interval:leeway:) 在 iOS 7/macOS 10.9 中引入,在 iOS 11/macOS 10.13 中已弃用。

最初 Apple 提供了 scheduleRepeatingscheduleOneshot 变体,但这没有任何意义,就好像计时器在重复,或者 oneshot 只能通过传递给函数的参数来扣除。现在他们只提供 schedule(deadline:repeating:leeway:),如果以非零值调用重复,则计时器重复,否则为单次。

但是请注意,实际上 GCD 计时器不是真正的对象,既不是 Swift 对象也不是 Objective-C 对象,实际上它们是表示为不透明指针的 C 结构。如果用C或Obj-C创建这样一个GCD对象,代码是这样的:

dispatch_source_t ds = dispatch_source_create(
    DISPATCH_SOURCE_TYPE_TIMER, 0, 0, someQueue
);
dispatch_source_set_timer(ds, startTime, interval, leeway);

让 GCD 对象显示为 Swift 对象实际上是 Xcode 和 Swift SDK 中内置的一些“魔法”。 schedule(deadline:repeating:leeway:) 仅在您使用 Xcode 9+ 和 Swift 4 时可用。如果您使用 Xcode 8.x 或在 Xcode 9+ 中使用 Swift 3,则只有已弃用的 scheduleRepeating(deadline:interval:leeway:) 可用。

与其他 API 不同,这不是你构建的 iOS/macOS SDK 版本的问题,因为 iOS/macOS SDK 不提供这种魔法,它取决于你构建的 Swift SDK 版本,这个版本是独立于目标操作系统,因为 SDK 嵌入到您的应用中,因此与您的应用一起交付。

这就是为什么您可以在 Xcode 9+ 的 Swift 4 中使用 schedule(deadline:repeating:leeway:) 并且仍然可以一直部署到 iOS 7.0/macOS 10.9,因为仅适用于您的 Swift代码调用已更改,在内部它使用与以前弃用的方法相同的 GCD API 调用,因此编译后的代码即使在这些旧操作系统版本上也能正常运行。

回答您关于语句有何不同的问题:好吧,它们有不同的名称,参数也有不同的名称,除了参数类型相同而且它们的工作方式也相同。

关于ios - 在 iOS 项目中使用 schedule(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50289332/

相关文章:

ios - Swift – 在容器 View 中嵌入长 UIView

javascript - 如何下载图像并将其显示在 NativeScript 应用程序中?

ios - iOS数据导入策略/设计

java - 尽管我使用了 Swing Timer,但在 JPanel 上从动画绘制 Wave 时 GUI 卡住

facebook - 如何安排发帖时间

ios - 对于 iOS 8 中的 App Extensions,我必须使用嵌入式框架来共享代码吗?

延迟调用函数的python装饰器

c# - 启动流程然后引发事件以监视它们

overriding - ActiveMQ 覆盖预定消息

java - 计时器时间表-Java