当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Swift Never task(id:priority:_:)用法及代码示例


实例方法

task(id:priority:_:)

在此视图出现之前或指定值更改时添加要执行的任务。

声明

func task<T>(
    id value: T,
    priority: TaskPriority = .userInitiated,
    _ action: @escaping () async -> Void
) -> some View where T : Equatable

返回值

在视图出现之前异步运行指定操作的视图,或使用 id 值更改重新启动任务。

参数

id

观察变化的值。该值必须符合 Equatable 协议。

priority

创建异步任务时使用的任务优先级。默认优先级为 userInitiated

action

SwiftUI 在视图出现之前作为异步任务调用的闭包。 SwiftUI 可以在视图消失后在动作完成前自动取消任务。如果id 值更改,SwiftUI 取消并重新启动任务。

详述

此方法的行为类似于 View/task(priority:_:) ,不同之处在于它还会在指定值更改时取消并重新创建任务。为了检测更改,修改器会测试 id 参数的新值是否等于先前的值。为此,值的类型必须符合 Equatable 协议。

例如,如果您定义了一个平等的 Server 类型,该类型在其状态更改时发布自定义通知(例如,从 signed outsigned in),您可以使用任务修饰符将 Text 视图的内容更新为反映当前选择的服务器的状态:


Text(status ?? "Signed Out")
    .task(id: server) {
        let sequence = NotificationCenter.default.notifications(
            named: .didChangeStatus,
            object: server)
        for try await notification in sequence {
            status = notification.userInfo["status"] as? String
        }
    }

此示例使用 notifications(named:object:) 方法无限期地等待由 AsyncSequence 实例给出的异步通知序列。

在其他地方,服务器定义了一个自定义 didUpdateStatus 通知:


extension NSNotification.Name {
    static var didUpdateStatus: NSNotification.Name {
        NSNotification.Name("didUpdateStatus")
    }
}

然后,服务器会在其状态发生变化时发布此类通知,例如在用户登录后:


let notification = Notification(
    name: .didUpdateStatus,
    object: self,
    userInfo: ["status": "Signed In"])
NotificationCenter.default.post(notification)

附加到 Text 视图的任务从通知的用户信息字典中获取并显示状态值。当用户选择不同的服务器时,SwiftUI 取消任务并创建一个新的,然后开始等待来自新服务器的通知。

可用版本

iOS 15.0+, iPadOS 15.0+, macOS 12.0+, Mac Catalyst 15.0+, tvOS 15.0+, watchOS 8.0+

相关用法


注:本文由纯净天空筛选整理自apple.com大神的英文原创作品 Never task(id:priority:_:)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。