Swift 延迟任务

「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战

大多数情况下,我们希望我们的各种异步任务在创建后尽快启动,但有时我们可能希望稍微延迟它们的执行——也许是为了给另一个任务时间先完成,或者 添加某种形式的“去抖动”行为。

尽管没有直接的、内置的方式来运行具有一定延迟的 Swift 任务,但我们可以通过在实际开始执行其操作之前让任务休眠给定的纳秒数来实现该行为:

image.png

上面对 Task.sleep 的调用使用 try 关键字标记的原因是,如果任务在其休眠期间被取消,该调用将引发错误。 因此,例如,如果我们想让视图控制器仅在异步操作花费超过 150 毫秒才能完成时显示加载微调器,那么我们可以实现如下所示:

image.png

现在,如果我们要在给定的代码库中使用大量延迟任务,那么可能值得定义一个简单的抽象来让我们更容易地创建这样的延迟任务——例如让我们能够使用更标准的 TimeInterval 值来定义基于秒的延迟,而不是必须使用纳秒:

image.png

有了上面的扩展,我们现在可以在想要创建延迟任务时简单地调用 Task.delayed。 这种方法的唯一缺点是我们现在必须在这些任务闭包中手动捕获自我:

image.png

不过,有一种方法可以解决这个小问题——那就是使用“半公共”_implicitSelfCapture 属性——这是 Swift 标准库用来使所有内置 Task 闭包自动捕获自引用的方法:

image.png

然而,由于上述属性还不是 Swift 的公共 API 的正式部分(鉴于它的名称带有下划线前缀),我真的不建议在生产代码中使用它——除非你愿意接受风险 任何使用它的代码都可能在任何时候中断。

我希望你喜欢这个快速浏览使用 Swift 新的内置任务 API 对延迟操作进行建模的几种不同方法。 当然,我们也可以选择使用旧工具来实现这种延迟——比如 Grand Central Dispatch、计时器,甚至是 Objective-C 运行时(至少在某些情况下)。 但是,当使用 Swift 新的并发系统编写异步代码时,能够直接使用 Task 类型来实现这种延迟行为会非常方便。

おすすめ

転載: juejin.im/post/7070881974914646046