|
|
1
7
据我所知,鉴于这一切都是全新的,无法保证
在 Swift Concurrency: Behind the Scenes 会话中,讨论了调度程序将尝试将事情保持在同一个线程上以避免上下文切换。不过,考虑到这一点,我不知道你会如何具体避免主线程,但也许我们不应该在意,只要任务进展顺利,从不阻塞。 我找到了时间戳(23:18),它解释了不能保证同一个线程在等待后会获得延续。 https://developer.apple.com/videos/play/wwdc2021/10254/?time=1398 |
|
|
2
5
即使您进行测试以找出等待的确切线程行为
此外,希望它不会导致在主线程上运行的任何问题。看见
https://developer.apple.com/videos/play/wwdc2021/10254/?time=2074
了解有关日程安排工作方式的详细信息。您不应该害怕通过调用
在您的例子中,Swift很可能认为上下文切换的性能打击不值得 < 返回 从主线程,因为它已经在那里了,但如果主线程更饱和,您可能会体验到不同的行为。 编辑
你看到的行为
|
|
|
3
3
以下公式有效,非常优雅地解决了整个问题,尽管我有点不愿意发布它,因为我真的不明白它是如何工作的:
我已经测试了
|
|
4
2
简要说明一下,自从提出这个问题以来,UIKit类被标记为
现在,回到讨论中的行为,这是意料之中的,正如其他人所说,这也是合乎逻辑的:
如果你将你的类转换为演员,你会看到你期望的行为。以下是根据问题中的代码调整的演员:
您可以在
如果参与并发操作的所有实体都已经是结构化并发家族的一部分,那么Swift的结构化并发效果最好,因为在这种情况下,编译器拥有做出明智决策所需的所有信息。 |
|
|
5
1
检查哪个线程任务正在运行是不可靠的,因为快速并发可能会在多个任务中使用相同的线程来避免上下文切换。您必须使用actor隔离来确保您的任务不会在actor上执行(这适用于任何actor以及
首先,swift中的演员是可重新进入的。这意味着无论何时
现在,如果您的一些长时间运行的调用是同步的,那么您必须删除
|
|
|
6
0
我对一个运行长任务并且应该始终在后台线程上运行的函数也有同样的问题。最终,使用新的Swift异步等待语法,我找不到一种基于Task或TaskGroup的简单方法来确保这一点。 Task.detached调用将使用不同的线程,Task调用本身也是如此。如果这是从主线程调用的,它将是另一个线程,如果不是,它可以是主线程。 最终,我找到了一个始终有效的解决方案,但看起来非常“粗糙”。
|
|
|
Tom · SwiftUI.sheet导致背景白色闪烁 1 年前 |
|
|
Danil · 种子/填充核心数据的最佳实践?[关闭] 1 年前 |
|
|
Robin · LazyVGrid项目预计不会击中测试区域 1 年前 |
|
|
Saurabh Saini · 结构下标 1 年前 |
|
|
Alex Smith · 移动到下一个视图控制器后如何显示警报? 1 年前 |