You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
并发和异步代码在增加调度灵活性的同时,也会增加复杂度。Swift 能够在你在编写异步代码时,提供一些编译时检查——例如,你可以使用 actor 来安全地访问可变状态。然而,为一段运行缓慢或是有错误的代码添加并发能力,并不一定就能使它变得更快速或者更正确地运行。事实上,简单地为代码增加并发能力甚至可能导致代码问题更难排查。不过,对于的确有必要并发执行的代码来说,Swift 语言级别的并发支持能帮助你在编译时就捕捉到错误。
9
+
并发和异步代码在增加调度灵活性的同时也会增加复杂度。Swift 能够在你在编写异步代码时,提供一些编译时检查——例如,你可以使用 actor 来安全地访问可变状态。然而,为一段运行缓慢或是有错误的代码添加并发能力,并不一定就能使它变得更快速或者更正确地运行。事实上,简单地为代码增加并发能力甚至可能导致代码问题更难排查。不过,对于的确有必要并发执行的代码来说,Swift 语言级别的并发支持能帮助你在编译时就捕捉到错误。
10
10
11
11
本章剩余的部分将使用*并发*一词指代异步和并行代码这一常见的组合。
12
12
13
13
> 如果你曾经编写过并发代码的话,那你可能习惯于使用线程。Swift 中的并发模型基于线程,但你不会直接与线程打交道。在 Swift 中,一个异步函数可以交出它在某个线程上的运行权 —— 这样,另一个异步函数在这个函数被阻塞时就能获得此在此线程上的运行权。但是,Swift 并不保证异步函数恢复运行时其将在哪条线程上运行。
14
14
15
-
你当然也可以不用 Swift 原生支持去写并发的代码,但这样代码的可读性会下降。比如,下面的这段代码会拉取一系列图片名称的列表,下载列表中的图片然后展示给用户:
15
+
你当然也可以不用 Swift 原生支持去写并发的代码,但这样代码的可读性会下降。比如,下面的这段代码会拉取一系列图片名称的列表,下载列表中的第一张图片然后展示给用户:
16
16
17
17
```swift
18
18
listPhotos(inGallery: "Summer Vacation") { photoNames in
@@ -52,7 +52,7 @@ listPhotos(inGallery: "Summer Vacation") { photoNames in
代码中被 `await` 标记的挂起点表明当前这段代码可能会暂停等待异步方法或函数的返回。这也被称为*让出线程(yielding the thread)*,因为在幕后 Swift 会挂起这段代码在当前线程的执行,转而让其他代码在当前线程执行。因为有 `await` 标记的代码可以被挂起,所以在程序中只有特定的地方才能调用异步方法或函数:
140
+
代码中被 `await` 标记的挂起点表明当前这段代码可能会暂停等待异步方法或函数的返回。这也被称为*让出线程*,因为在幕后 Swift 会挂起这段代码在当前线程的执行,转而让其他代码在当前线程执行。因为有 `await` 标记的代码可以被挂起,所以在程序中只有特定的地方才能调用异步方法或函数:
0 commit comments