问题标签 [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 回答
150 浏览

swift - MainActor.run 在分离任务中调用时无法运行关闭

我在尝试通过将闭包传递给MainActor.run.

为了说明这个问题,考虑一个计算文件夹及其子目录中文件数量的函数。它在Task.detached闭包中运行,因为我不希望它阻塞主线程。每 10,000 个文件更新一个Published属性fileCount,通过将闭包传递给MainThread.run.

但是,用户界面无法更新,甚至给了我一个旋转的沙滩球。阻止这种情况的唯一方法是await Task.sleep(1_000_000_000)在调用之前插入MainThread.run. 这是代码:

如果我恢复到实现此目的的旧方法,该代码将起作用:

我究竟做错了什么?

顺便说一句 - 如果你想尝试这段代码,这里有一个测试工具。请务必选择一个包含大量文件的文件夹及其子文件夹。

0 投票
1 回答
858 浏览

swift - 错误:属性初始化程序中不能发生“异步”调用

我正在尝试将 aStateObject actor的初始化程序放在 aasyncApp,但我找不到这样做的方法。

假设我有这个演员:

这导致名义上的错误:

这会导致类似的错误:

甚至这些也行不通:

看来无论我做什么,我都不能Foo成为MyApp. 我在这里想念什么?这当然是可能的。

我在使用 SwiftUI 时也遇到了同样的问题View,所以任何适用于Views 和Apps 的建议都会非常棒!

0 投票
1 回答
175 浏览

swift - Swift Group Tasks 未并行运行

问题:

  • 为什么组任务不并行运行?
  • 我错过了什么还是这是一个错误?

输出:

环境:

  • macOS 11.5.2 (20G95)
  • Xcode 版本 13.0 测试版 5 (13A5212g)
  • SwiftUI 项目

代码:

0 投票
1 回答
393 浏览

swift - Swift async let 取消不起作用

我对取消的任务感到有些困惑。

概述:

  • checkCancellation函数有 2 个子任务,一个任务运行computeA,另一个computeB. 它们同时运行,computeB引发错误。

怀疑:

  • 我预计子任务computeA会被取消,因为computeB引发了错误,但从computeA未被取消。
  • 我的理解是错误的还是我遗漏了什么?
  • 或者这是一个错误?

笔记:

  • 我正在使用一个SwiftUI项目(因为 Swift Playgrounds 不支持async let
  • macOS Big Sur 11.5.2 (20G95)
  • Xcode Version 13.0 beta 5 (13A5212g)

输出:

并发函数定义:

调用并发函数

观察:

  • 当我将代码更改为let c = try await b + a

输出:

怀疑:

我仍然不确定我是否理解原始代码中这种行为的原因

0 投票
1 回答
177 浏览

swift - 异步自动释放池

我有一种情况,我正在使用 循环创建许多 Cocoa 对象async/await,并且内存尖峰,因为这些对象仅在循环结束时才被释放(而不是每次迭代)。

解决方案是使用autoreleasepool. 但是,我似乎无法autoreleasepoolasync/await.

这是一个例子:

内存一直飙升到 220MB,这对我来说有点太多了。

通常,您可以将内部循环包装在 aautoreleasepool中,这样可以解决问题,但是当我使用async函数尝试时,会出现以下错误:

有没有办法解决?或者是否有另一种方法可以实现在循环内释放 Cocoa 对象的相同目标?

0 投票
1 回答
112 浏览

swift - 无法设置 AsyncStream `onTermination` 处理程序

有没有人成功创建 AsyncStream 并设置它的onTermination处理程序?我做不到。以下内容直接从提案中复制并粘贴(https://github.com/apple/swift-evolution/blob/main/proposals/0314-async-stream.md),除了我通过现代化摆脱了detach警告Task.detached

看起来不错,但它不能编译,而且我找不到让它编译的方法。设置器上的错误消息onTermination如下:

我不知道编译器要我做什么。有没有人解决这个问题,解决方案是什么?

(我已经为此提交了一个错误。)

0 投票
1 回答
334 浏览

swift - 使用 Core Data 等待 withTaskGroup 有时会失败

我有以下任务组,使用 Swift 5.5 中的异步/等待并发,我在其中迭代米,onboardingMeter从核心数据中获取。这在 5 次中有 4 次都可以正常工作,但随后会导致 iOS 应用程序崩溃。我正在通过从 iOS 设备中删除应用程序来测试这一点,并从一开始就运行入职。有时我可以连续运行 4 次或 5 次或 6 次没有问题,然后它突然崩溃并出现以下错误:

这是失败的代码,let onboardingMeter = await OnboardingMeter.fromMeterDict永远不会返回,失败时我看不到第二个打印语句。

这是 Swift 测试版中的一个错误,还是我在这里犯了任何错误?当新的 iOS 15 测试版到来,以及 iOS 15 的正式版本发布时,我会再试一次。

OnboardingMeter.fromMeterDict功能:

并找到OrCreateInstance:

0 投票
0 回答
66 浏览

swift - 如何使用 mainActor 实现延续

我正在使用 WWDC21 中展示的 Swift 延续

我正在尝试将registerForRemoteNotification实现包装在其中

我基本上有以下,我认为它简单明了。

事情是这样的:

当上面被调用时,它activateContinuation是 nil,部分原因是它被声明为可选的,但是当单步执行时self.activeContinuation = continuation它有一个值

0 投票
0 回答
45 浏览

swift - 如果我想稍后重构为异步/等待,我应该使用回调还是 PromiseKit?

现在,Swift 5.5 withasync/await仅在 Xcode 13 beta中可用。所以我仍然使用旧的 Xcode 版本来开发项目。但是当async/await稳定时,我会重构源代码以使用这个强大的功能。那么我应该使用callbacks还是异步处理程序库PromiseKit以便在那时轻松重构?

0 投票
0 回答
95 浏览

swift - 线程 1:每当我尝试发出网络请求时,EXC_BAD_ACCESS (code=EXC_I386_GPFLT)

每当我运行我的应用程序并使用我的请求实用程序时,我都会遇到奇怪的崩溃。

这是在 XCode Beta 13.5 上

我应该提到我也在使用 Thread Sanitizer。此错误仅在启用 Thread Sanitizer 时出现。

这是代码:

首先,我有一个按钮,点击时提交数据

这是 submitData 函数

这是 AuthenticationAPI.login 函数

最后这是网络调用

永远不会调用 executeRequest 函数,因为它永远不会发出请求(我检查了我的本地服务器)。

这些是线程日志: