问题标签 [mainactor]

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 投票
4 回答
985 浏览

swift - 在 MainActor 调用后,asyncDetached 回到主线程

我正在尝试新的 async/await 东西。我的目标是test()在后台运行该方法,所以我使用Task.detached; 但是在test()我需要在主线程上进行调用时,所以我使用的是 MainActor。

(我意识到这可能看起来很复杂,但它从一个更好的现实世界案例中减少了。)

好的,所以测试代码看起来像这样(在视图控制器中):

第一个print说我不在主线程上。这就是我所期望的。

但第二个print说我主线程上。这不是我所期望的。

感觉好像我只是因为调用了一个 MainActor 函数而神秘地回到了主线程。我以为我会等待主线程,然后在我已经在的后台线程中恢复。

这是一个错误,还是我的期望错误?如果是后者,我如何期间跳出主线程,await然后又回到我所在的线程?我认为这正是 async/await 可以轻松实现的...?

(在某种程度上,我可以通过在调用Task.detached之后再次调用来“解决”这个问题getBounds;但那时我的代码看起来非常像嵌套的 GCD,我不得不怀疑我为什么要使用 async/await。)

也许我还为时过早,但我继续将此作为错误提交:https ://bugs.swift.org/browse/SR-14756 。


更多注释

我可以通过更换来解决问题

但这似乎是不必要的复杂,并不能说服我原来的现象不是错误。


我也可以通过使用演员来解决这个问题,这开始看起来是最好的方法。但同样,这并不能让我相信我在这里注意到的现象不是错误。


我越来越确信这是一个错误。我刚刚遇到(并报告)以下内容:

这打印howdy,然后第二个print打印true。但是如果我们注释掉第一个打印,剩下的(第二个)print打印false

仅仅添加或删除一条打印语句如何改变我们所在的线程?这当然不是故意的。

0 投票
0 回答
66 浏览

swift - 如何使用 mainActor 实现延续

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

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

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

事情是这样的:

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

0 投票
1 回答
229 浏览

swift - 使用 Swift async、await、@MainActor 进行后台任务的最佳解决方案是什么

我正在学习Swift 的async, await, @MainActor

我想运行一个很长的过程并显示进度。

当我点击“开始调度”按钮时,“计数”会更新,但会收到警告:

不允许从后台线程发布更改;确保在模型更新时从主线程发布值(通过接收(on :) 等运算符)。

我认为类ViewModel@MainActorcount属性是在Main线程中操作的,但不是。我应该使用DispatchQueue.main.async{}更新count@MainActor

当我点击“开始任务”按钮时,按下按钮直到countupAsync()完成并且不更新屏幕上的计数。

什么是最好的解决方案?

0 投票
1 回答
100 浏览

multithreading - SwiftUI @MainActor 失去了全局演员

我有一个 ObservableObject 类,我通过@StateObject 从我的视图中调用它。该类内部是一个函数,整个类都标记为@MainActor。在我看来,有一个带有 onChange 修饰符的 TextField,它通过 viewModel.funcname 执行对该函数的调用。

XCode 抱怨以下错误:

我已经研究了几个小时,几乎没有发现任何东西。甚至Apple自己的文档都说要简单地使用await,但这不起作用,至少不是我尝试过的许多方法。

这是我认为的代码:

这是我班级中的函数(请记住,整个班级都标有@MainActor):

我尝试将 onChange 修改为如下所示:

我标记类@MainActor 的全部原因是因为XCode 抱怨该函数没有在主线程上运行。它在控制台中抱怨了几次后编译但冻结了。

我尝试过的一切似乎都没有改变。希望有人可以对此有所了解。