问题标签 [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.

0 投票
1 回答
1531 浏览

ios - 我可以在 Swift 中使用演员来始终调用主线程上的函数吗?

我最近看到 Swift 在Swift 5.5中引入了 Actor 模型的并发支持。当我们有一个共享的、可变的状态时,这个模型使安全的并发代码能够避免数据竞争。

我想避免我的应用程序 UI 中的主线程数据竞争。为此,DispatchQueue.main.async无论我设置UIImageView.image属性或UIButton样式,我都会在调用站点进行包装。

这似乎不安全,因为我必须记住在主队列上手动调度该方法。另一个解决方案如下所示:

但这看起来像很多样板文件,我不会说我喜欢将它用于具有不止一层嵌套的复杂函数。

对 Actors 的 Swift 支持的发布看起来是一个完美的解决方案。那么,有没有办法让我的代码更安全,即始终使用 Actors 在主线程上调用 UI 函数?

0 投票
1 回答
1116 浏览

swift - 如何使用异步等待 Swift 5.5 等待 x 秒

如何使用新的 Swift 5.5await关键字等待一段时间?

通常,使用完成处理程序,您会通过使用DispatchQueue's得到类似的东西asyncAfter(deadline:execute:)

如何将其转换为在 Swift 5.5中使用async& ?await

0 投票
1 回答
233 浏览

swift - 使 @MainActor 类或演员符合 Codable

如何将 Codable 一致性添加到需要隔离到 MainActor 的类中?

例如,以下代码给出了编译器错误:

我现在肯定在努力让我的头脑围绕演员和@MainActor!

0 投票
2 回答
700 浏览

swift - 在不支持并发的函数中等待 Swift 5.5 中两个任务完成的正确方法是什么?

我有一个应用程序可以在给定字符串的情况下进行一些处理,这是在 2Task秒内完成的。在此期间,我正在显示动画。当这些Task完成后,我需要隐藏动画。下面的代码有效,但不是很好看。我相信有更好的方法来做到这一点?

0 投票
1 回答
794 浏览

swift - 使参与者符合序列协议

如何使参与者符合Sequence协议?以下代码生成编译器警告:

与全局角色“MainActor”隔离的实例方法“makeIterator()”无法满足协议“序列”的相应要求

0 投票
1 回答
770 浏览

swift - Swift 5.5 中使用 async/await 的循环函数

我想在完成后 5 秒继续触发一个函数。

以前我会在函数末尾使用它:

但我想使用Swift 5.5's async/await

如果我使用这样的东西:

我收到一个警告,Function call causes an infinite recursion它并不能真正取消。

这编译得很好:

虽然它每 5 秒触发一次,但当我的SwiftUI视图被关闭时它会继续运行。我开始使用:

因为它都在同一个上运行,当视图被删除时,它Taskdetached应该全部取消吗?

实现这一目标的现代方法是什么async/await

0 投票
1 回答
90 浏览

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来初始化其内容属性(这也必须是可选的才能使其工作)。这看起来很讨厌,并且具有需要在引用它的任何地方打开它的连锁反应:

最后,我无法让RecordsModelto 符合Encodable. 我尝试过encode(to encoder: Encoder)异步,但这并不能解决问题。目前,因此RecordsModel只是符合Decodable.

0 投票
1 回答
91 浏览

swift - 为什么结构类型 UUID 不可发送?

鉴于 UUID 类型是一个结构,我认为它会是Sendable. 但是编译器会生成一个警告:

0 投票
1 回答
173 浏览

swift - 从 SwiftUI 视图中更新 @State 属性

我有一个AsyncContentView在视图出现时处理数据加载并处理加载视图和内容的切换(取自此处swiftbysundell):

为了完整起见,这是Parsable协议:

LoadingState和_Loader

这是我正在使用的一些虚拟数据:

现在我把它们放在一起,这样就可以了。它处理async显示加载视图 2 秒的函数,然后使用提供的数据生成内容视图:

现在我遇到的问题是,这个数据包含应该选择哪个段。在我的真实应用程序中,这是一个获取数据的 Web 请求,其中包括选择了哪个段。

那么我怎样才能让这个视图更新selectedInterface @state属性呢?

如果我只是添加该行

进入我的AsyncContentView我得到这个错误

类型 '()' 不能符合 'View'

在此处输入图像描述

0 投票
1 回答
230 浏览

swift - Swift 5.5 并发:创建具有自定义错误类型的任务

我需要在我创建的任务中使用我自己的自定义错误枚举:

但我在任务初始化程序的开头收到以下错误: Referencing initializer 'init(priority:operation:)' on 'Task' requires the types 'MyError' and 'Error' be equivalent.

如何限制Task仅抛出属于我的自定义错误类型的错误MyError