问题标签 [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.
swift - MainActor.run 在分离任务中调用时无法运行关闭
我在尝试通过将闭包传递给MainActor.run
.
为了说明这个问题,考虑一个计算文件夹及其子目录中文件数量的函数。它在Task.detached
闭包中运行,因为我不希望它阻塞主线程。每 10,000 个文件更新一个Published
属性fileCount
,通过将闭包传递给MainThread.run
.
但是,用户界面无法更新,甚至给了我一个旋转的沙滩球。阻止这种情况的唯一方法是await Task.sleep(1_000_000_000)
在调用之前插入MainThread.run
. 这是代码:
如果我恢复到实现此目的的旧方法,该代码将起作用:
我究竟做错了什么?
顺便说一句 - 如果你想尝试这段代码,这里有一个测试工具。请务必选择一个包含大量文件的文件夹及其子文件夹。
swift - 错误:属性初始化程序中不能发生“异步”调用
我正在尝试将 aStateObject
actor
的初始化程序放在 aasync
中App
,但我找不到这样做的方法。
假设我有这个演员:
这导致名义上的错误:
这会导致类似的错误:
甚至这些也行不通:
看来无论我做什么,我都不能Foo
成为MyApp
. 我在这里想念什么?这当然是可能的。
我在使用 SwiftUI 时也遇到了同样的问题View
,所以任何适用于View
s 和App
s 的建议都会非常棒!
swift - Swift Group Tasks 未并行运行
问题:
- 为什么组任务不并行运行?
- 我错过了什么还是这是一个错误?
输出:
环境:
- macOS 11.5.2 (20G95)
- Xcode 版本 13.0 测试版 5 (13A5212g)
- SwiftUI 项目
代码:
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
输出:
怀疑:
我仍然不确定我是否理解原始代码中这种行为的原因
swift - 异步自动释放池
我有一种情况,我正在使用 循环创建许多 Cocoa 对象async/await
,并且内存尖峰,因为这些对象仅在循环结束时才被释放(而不是每次迭代)。
解决方案是使用autoreleasepool
. 但是,我似乎无法autoreleasepool
与async/await
.
这是一个例子:
内存一直飙升到 220MB,这对我来说有点太多了。
通常,您可以将内部循环包装在 aautoreleasepool
中,这样可以解决问题,但是当我使用async
函数尝试时,会出现以下错误:
有没有办法解决?或者是否有另一种方法可以实现在循环内释放 Cocoa 对象的相同目标?
swift - 无法设置 AsyncStream `onTermination` 处理程序
有没有人成功创建 AsyncStream 并设置它的onTermination
处理程序?我做不到。以下内容直接从提案中复制并粘贴(https://github.com/apple/swift-evolution/blob/main/proposals/0314-async-stream.md),除了我通过现代化摆脱了detach
警告Task.detached
:
看起来不错,但它不能编译,而且我找不到让它编译的方法。设置器上的错误消息onTermination
如下:
我不知道编译器要我做什么。有没有人解决这个问题,解决方案是什么?
(我已经为此提交了一个错误。)
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:
swift - 如何使用 mainActor 实现延续
我正在使用 WWDC21 中展示的 Swift 延续
我正在尝试将registerForRemoteNotification
实现包装在其中
我基本上有以下,我认为它简单明了。
事情是这样的:
当上面被调用时,它activateContinuation
是 nil,部分原因是它被声明为可选的,但是当单步执行时self.activeContinuation = continuation
它有一个值
swift - 如果我想稍后重构为异步/等待,我应该使用回调还是 PromiseKit?
现在,Swift 5.5 withasync/await
仅在 Xcode 13 beta中可用。所以我仍然使用旧的 Xcode 版本来开发项目。但是当async/await
稳定时,我会重构源代码以使用这个强大的功能。那么我应该使用callbacks
还是异步处理程序库PromiseKit
以便在那时轻松重构?
swift - 线程 1:每当我尝试发出网络请求时,EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
每当我运行我的应用程序并使用我的请求实用程序时,我都会遇到奇怪的崩溃。
这是在 XCode Beta 13.5 上
我应该提到我也在使用 Thread Sanitizer。此错误仅在启用 Thread Sanitizer 时出现。
这是代码:
首先,我有一个按钮,点击时提交数据
这是 submitData 函数
这是 AuthenticationAPI.login 函数
最后这是网络调用
永远不会调用 executeRequest 函数,因为它永远不会发出请求(我检查了我的本地服务器)。
这些是线程日志: