gpt4 book ai didi

swift - 从无任务上下文同步访问 actor 属性

转载 作者:行者123 更新时间:2023-12-01 23:08:37 26 4
gpt4 key购买 nike

整合 actors使用现有代码似乎并不像 Apple 希望您相信的那么简单。考虑以下简单的参与者:

actor Foo {
var value: Int = 0
}

试图从任何 AppKit/UIKit 访问此属性(无任务) Controller 无法工作,因为每个 Task是异步的。

class AppKitController {

func myTaskLessFunc() {
let f = Foo()
var v: Int = -1
Task { v = await f.value }
}
}

这会给你预期的错误 Mutation of captured var 'v' in concurrently-executing code ,如果你试图锁定它也不会起作用。 nonisolated actor 方法也无济于事,因为您会遇到同样的问题。

那么,您如何在无任务上下文中同步读取 actor 属性呢?

最佳答案

我找到了一种使用 Combine 的方法,如下所示:

import Combine

actor Foo {

nonisolated let valuePublisher = CurrentValueSubject<Int, Never>(0)

var value: Int = 0 {
didSet {
valuePublisher.value = value
}
}
}

通过提供非隔离的发布者,我们可以将 actor 值安全地传播到外部,因为 Publisher 是线程安全的。

调用者可以访问 foo.valuePublisher.value 或从外部订阅它,而无需异步上下文。

关于swift - 从无任务上下文同步访问 actor 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70332056/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com