我正在尝试在 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 提供了 scheduleRepeating
和 scheduleOneshot
变体,但这没有任何意义,就好像计时器在重复,或者 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/