在 iOS 项目上使用 schedule()
Using schedule() on an iOS project
我正在尝试在 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?
PS
使用不推荐使用的 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.[=18 中已弃用=]
最初 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 对象实际上是一些 "magic" 内置于 Xcode 和 Swift SDK 中。 schedule(deadline:repeating:leeway:)
仅在您使用 Xcode 9+ 和 Swift 4 时可用。如果您使用 Xcode 8.x 或如果您使用 Swift 3 Xcode 9+,则只有已弃用的 scheduleRepeating(deadline:interval:leeway:)
可用。
与其他 API 不同,这不是您构建的 iOS/macOS SDK 版本的问题,因为 iOS/macOS SDK 不提供这种魔法,它取决于Swift 您为其构建的 SDK 版本,此版本独立于目标操作系统,因为 SDK 嵌入到您的应用程序中,因此与您的应用程序一起发布。
这就是为什么您可以在 Swift 4 中使用 schedule(deadline:repeating:leeway:)
在 Xcode 9+ 中并仍然一直部署到 iOS 7.0/macOS 10.9,因为只有你的 Swift 代码调用发生了变化,它在内部使用了与之前弃用的方法相同的 GCD API 调用,所以即使在这些旧的 OS 版本。
回答您关于这些语句有何不同的问题:好吧,它们有不同的名称,参数也有不同的名称,除了参数类型相同而且它们的工作方式也相同。
我正在尝试在 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?
PS 使用不推荐使用的 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.[=18 中已弃用=]
最初 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 对象实际上是一些 "magic" 内置于 Xcode 和 Swift SDK 中。 schedule(deadline:repeating:leeway:)
仅在您使用 Xcode 9+ 和 Swift 4 时可用。如果您使用 Xcode 8.x 或如果您使用 Swift 3 Xcode 9+,则只有已弃用的 scheduleRepeating(deadline:interval:leeway:)
可用。
与其他 API 不同,这不是您构建的 iOS/macOS SDK 版本的问题,因为 iOS/macOS SDK 不提供这种魔法,它取决于Swift 您为其构建的 SDK 版本,此版本独立于目标操作系统,因为 SDK 嵌入到您的应用程序中,因此与您的应用程序一起发布。
这就是为什么您可以在 Swift 4 中使用 schedule(deadline:repeating:leeway:)
在 Xcode 9+ 中并仍然一直部署到 iOS 7.0/macOS 10.9,因为只有你的 Swift 代码调用发生了变化,它在内部使用了与之前弃用的方法相同的 GCD API 调用,所以即使在这些旧的 OS 版本。
回答您关于这些语句有何不同的问题:好吧,它们有不同的名称,参数也有不同的名称,除了参数类型相同而且它们的工作方式也相同。