问题标签 [swift-concurrency]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - 我可以在 Swift 中使用演员来始终调用主线程上的函数吗?
我最近看到 Swift 在Swift 5.5中引入了 Actor 模型的并发支持。当我们有一个共享的、可变的状态时,这个模型使安全的并发代码能够避免数据竞争。
我想避免我的应用程序 UI 中的主线程数据竞争。为此,DispatchQueue.main.async
无论我设置UIImageView.image
属性或UIButton
样式,我都会在调用站点进行包装。
这似乎不安全,因为我必须记住在主队列上手动调度该方法。另一个解决方案如下所示:
但这看起来像很多样板文件,我不会说我喜欢将它用于具有不止一层嵌套的复杂函数。
对 Actors 的 Swift 支持的发布看起来是一个完美的解决方案。那么,有没有办法让我的代码更安全,即始终使用 Actors 在主线程上调用 UI 函数?
swift - 如何使用异步等待 Swift 5.5 等待 x 秒
如何使用新的 Swift 5.5await
关键字等待一段时间?
通常,使用完成处理程序,您会通过使用DispatchQueue
's得到类似的东西asyncAfter(deadline:execute:)
:
如何将其转换为在 Swift 5.5中使用async
& ?await
swift - 使 @MainActor 类或演员符合 Codable
如何将 Codable 一致性添加到需要隔离到 MainActor 的类中?
例如,以下代码给出了编译器错误:
我现在肯定在努力让我的头脑围绕演员和@MainActor!
swift - 在不支持并发的函数中等待 Swift 5.5 中两个任务完成的正确方法是什么?
我有一个应用程序可以在给定字符串的情况下进行一些处理,这是在 2Task
秒内完成的。在此期间,我正在显示动画。当这些Task
完成后,我需要隐藏动画。下面的代码有效,但不是很好看。我相信有更好的方法来做到这一点?
swift - 使参与者符合序列协议
如何使参与者符合Sequence
协议?以下代码生成编译器警告:
与全局角色“MainActor”隔离的实例方法“makeIterator()”无法满足协议“序列”的相应要求
swift - Swift 5.5 中使用 async/await 的循环函数
我想在完成后 5 秒继续触发一个函数。
以前我会在函数末尾使用它:
但我想使用Swift 5.5
's async/await
。
如果我使用这样的东西:
我收到一个警告,Function call causes an infinite recursion
它并不能真正取消。
这编译得很好:
虽然它每 5 秒触发一次,但当我的SwiftUI
视图被关闭时它会继续运行。我开始使用:
因为它都在同一个上运行,当视图被删除时,它Task
不detached
应该全部取消吗?
实现这一目标的现代方法是什么async/await
?
swift - 并发世界中的 SwiftUI macOS 文档应用架构
我试图找出使用 SwiftUI 和 Swift 5.5 并发功能的 macOS 文档应用程序的正确结构。
我想演示以线程安全的方式异步更新文档的数据,并能够在文件中读取/写入数据,同时也是线程安全的并且在后台运行。然而,我正在努力:
- 编写干净的代码 - 与我之前使用的应用程序相比,其中一些看起来不优雅,更像是
DispatchQueues
笨重 - 为参与者实现
Codeable
一致性
我正在寻求关于如何改进这一点的想法、更正和建议。我已经在GitHub 上发布了完整的代码,因为我只会在这里突出一些特定的元素。这是一个最小可行的应用程序,仅用于概念验证。
该应用程序
该应用程序显示一个Records
带有添加更多按钮的列表。它应该能够从文件中保存和重新加载列表。
当前方法/设计
我选择了ReferenceFileDocument
该类型的协议Document
,因为这是我将在具有更复杂数据结构的未来应用程序中使用的协议。(即我不打算使用纯的集合structs
来保存文档的数据)
Document
具有表示顶级数据结构content
的类型属性。RecordsModelView
RecordsModelView
被注释@MainActor
以确保它收到的任何更新都将在主线程上处理。
RecordsModelView
有一个类型的属性RecordsModel
。这是一个参与者,确保其数组的读/写Records
是线程安全的,但不通过 MainActor 协调以提高效率。
该应用程序假定添加项目的函数需要很长时间,因此使用Task
. 虽然这里没有演示,但我也假设addRecord
可能从多个后台线程调用,因此需要是线程安全的,因此使用actor
.
代码编译并运行,允许将新项目添加到列表中,但是......
问题
首先,我无法注释- 生成我无法解决的编译器错误Document
。@MainActor
如果可以的话,我认为它可能会解决我的一些问题......
其次,因此我有一种笨拙的方式Document
来初始化其内容属性(这也必须是可选的才能使其工作)。这看起来很讨厌,并且具有需要在引用它的任何地方打开它的连锁反应:
最后,我无法让RecordsModel
to 符合Encodable
. 我尝试过encode(to encoder: Encoder)
异步,但这并不能解决问题。目前,因此RecordsModel
只是符合Decodable
.
swift - 为什么结构类型 UUID 不可发送?
鉴于 UUID 类型是一个结构,我认为它会是Sendable
. 但是编译器会生成一个警告:
swift - 从 SwiftUI 视图中更新 @State 属性
我有一个AsyncContentView
在视图出现时处理数据加载并处理加载视图和内容的切换(取自此处swiftbysundell):
为了完整起见,这是Parsable
协议:
LoadingState
和_Loader
这是我正在使用的一些虚拟数据:
现在我把它们放在一起,这样就可以了。它处理async
显示加载视图 2 秒的函数,然后使用提供的数据生成内容视图:
现在我遇到的问题是,这个数据包含应该选择哪个段。在我的真实应用程序中,这是一个获取数据的 Web 请求,其中包括选择了哪个段。
那么我怎样才能让这个视图更新selectedInterface
@state
属性呢?
如果我只是添加该行
进入我的AsyncContentView
我得到这个错误
类型 '()' 不能符合 'View'
swift - Swift 5.5 并发:创建具有自定义错误类型的任务
我需要在我创建的任务中使用我自己的自定义错误枚举:
但我在任务初始化程序的开头收到以下错误:
Referencing initializer 'init(priority:operation:)' on 'Task' requires the types 'MyError' and 'Error' be equivalent
.
如何限制Task
仅抛出属于我的自定义错误类型的错误MyError
?