Swift 5.5之Continuation

Continuation是Swift 5.5中引入的一种新的编程模型,用于管理异步任务的结果。它允许您在异步任务完成后使用结果继续执行代码,可以与Async/Await一起使用,以简化异步编程。

下面是使用Continuation的基本步骤:

  1. 导入Continuation模块

在使用Continuation之前,需要在代码文件中导入Continuation模块。

|---|-------------------------|
| 1 | import Continuation |

  1. 定义异步函数

异步函数是使用Continuation的第一步。异步函数是一个具有异步功能的函数,例如,使用URLSession从网络获取数据。

|---------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 | func fetchFromServer``(``url``: ``URL``) ``async throws -``> Data { ``let (``data``, ``_``) = ``try await URLSession``.``shared``.``data``(``from``: ``url``) ``return data } |

在上面的代码中,fetchFromServer函数使用了async关键字,表示它是一个异步函数,使用await关键字来等待异步任务的完成。

  1. 使用Continuation

现在,您可以使用Continuation来管理异步任务的结果了。Continuation具有一个resume(with result: Value)方法,它可以用于在异步任务完成后继续执行代码,并将结果传递给下一个操作。

|-------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | func fetchFromServer``(``url``: ``URL``) ``async throws -``> Data { ``return try await withUnsafeThrowingContinuation { ``continuation in ``URLSession``.``shared``.``dataTask``(``with``: ``url``) { ``data``, ``_``, ``error in ``if let error = ``error { ``continuation``.``resume``(``throwing``: ``error``) ``} ``else if let data = ``data { ``continuation``.``resume``(``returning``: ``data``) ``} ``else { ``fatalError``(``"Unexpected state: No error or data returned"``) ``} ``}.``resume``() ``} } |

在上面的代码中,withUnsafeThrowingContinuation方法接受一个闭包作为参数,这个闭包具有一个Continuation对象作为输入参数。在闭包中,您可以执行异步任务,并在异步任务完成后使用continuation.resume方法来继续执行代码。

resume方法接受一个结果作为参数,该结果可以是任何类型,与异步函数的返回类型相对应。在上面的示例中,结果是一个Data对象。

如果异步任务遇到错误,则可以使用continuation.resume(throwing:)方法抛出错误。

注意,您必须在异步任务的回调中使用resume方法来继续执行代码,而不是在异步函数的主体中。这是因为异步任务在后台线程中执行,如果在主线程中使用resume方法,会导致死锁。

使用Continuation,您可以更加方便地管理异步任务的结果,并将异步代码与同步代码结合起来,使得代码更加简洁和易于理解。

相关推荐
Fairy_sevenseven3 分钟前
【二十八】【QT开发应用】模拟WPS Tab
开发语言·qt·wps
存储服务专家StorageExpert8 分钟前
DELL SC compellent存储的四种访问方式
运维·服务器·存储维护·emc存储
蜡笔小新星10 分钟前
Python Kivy库学习路线
开发语言·网络·经验分享·python·学习
凯子坚持 c10 分钟前
C语言复习概要(三)
c语言·开发语言
无限大.22 分钟前
c语言200例 067
java·c语言·开发语言
余炜yw24 分钟前
【Java序列化器】Java 中常用序列化器的探索与实践
java·开发语言
篝火悟者25 分钟前
问题-python-运行报错-SyntaxError: Non-UTF-8 code starting with ‘\xd5‘ in file 汉字编码问题
开发语言·python
Death20028 分钟前
Qt 中的 QListWidget、QTreeWidget 和 QTableWidget:简化的数据展示控件
c语言·开发语言·c++·qt·c#
六点半88829 分钟前
【C++】速通涉及 “vector” 的经典OJ编程题
开发语言·c++·算法·青少年编程·推荐算法
惜.己29 分钟前
javaScript基础(8个案例+代码+效果图)
开发语言·前端·javascript·vscode·css3·html5