Swift 5.5之Continuation

2023-09-17 10:20:32

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(urlURLasync throws -> Data {

    let (data_) = try await URLSession.shared.data(fromurl)

    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(urlURLasync throws -> Data {

    return try await withUnsafeThrowingContinuation continuation in

        URLSession.shared.dataTask(withurl) { data_error in

            if let error error {

                continuation.resume(throwingerror)

            else if let data data {

                continuation.resume(returningdata)

            else {

                fatalError("Unexpected state: No error or data returned")

            }

        }.resume()

    }

}

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

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

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

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

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

更多推荐

redis常见问题

Redis的数据结构有哪些?请简要描述它们的特点和应用场景。答:Redis支持的数据结构包括字符串(String)、哈希表(Hash)、列表(List)、集合(Set)、有序集合(SortedSet)等。字符串是最基本的数据类型,可以存储文本或二进制数据。哈希表适合存储对象形式的数据,方便单独读写字段。列表可以用于实现

Redis 五大类型源码及底层实现

面试题:谈谈Redis数据类型的底层数据结构:SDS动态字符串双向链表玉缩列表ziplist哈希表hashtable跳表kiplist整数集合intset快速列表quicklist紧凑列表listpackRedis源代码的核心部分官网:GitHub-redis/redis:Redisisanin-memorydatab

【Redis】关于过期数据清除的一些策略

这里要讨论的为过期的数据是如何被清除的,也就是网上常常讨论的过期清除策略。需要注意的是,redis除了会对过期的数据进行淘汰,也可以通过对内存大小进行限制,并对超出内存限制后进行数据淘汰。此时淘汰的数据未必是过期的,只是因为内存达到限制而被淘汰。需要注意一下两者的区别,数据淘汰算法包括LRU、LFU等。好,回归过期数据

基于Python的海量豆瓣电影、数据获取、数据预处理、数据分析、可视化、大屏设计项目(含数据库)

目录项目介绍研究背景国内外研究现状分析研究目的研究意义研究总体设计网络爬虫介绍豆瓣电影数据的采集数据预处理大数据分析及可视化豆瓣影评结构化分析大屏可视化文本可视化总结每文一语项目介绍有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主!!!!!!!!!!本文基于Python的网络爬虫手段对豆瓣电影网站进行数据

Javascript数据类型和类型转换的应用场景

🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!目录基础数据类型和引用数据类型使用typeof操作符包装类型隐式类型转换1.数字转字符串:2.字符串转数字:3.布尔值转数字:4.字符串转布尔值:5.对象的隐式转换显式类型转换类型转换规则1.类型转换的优先级:在J

Python 之plt.plot()的介绍以及使用

文章目录介绍代码实例介绍plt.plot()是Matplotlib库中用于绘制线图(折线图)的主要函数之一。它的作用是将一组数据点连接起来,以可视化数据的趋势、关系或模式。以下是plt.plot()的详细介绍:plt.plot(x,y,fmt,**kwargs)x:表示X轴上的数据点,通常是一个列表、数组或一维序列,用

使用ZoeDepth生成深度估计图

目前单目深度估计分为两个派系,metricdepthestimation(度量深度估计,也称绝对深度估计)和relativedepthestimation(相对深度估计)。ZoeDepth是第一个结合相对和绝对深度的多模态单目深度估计网络。本博文仅记录使用ZoeDepth生成深度估计图的过程(因为直接按项目说明中进行使

【Azure】浅析 Azure 交互工具:Azure 门户、Azure Cloud Shell、 Azure CLI 和 Azure PowerShell | 文末送书

文章目录前言Azure门户AzureCloudShell,包括AzureCLI和AzurePowerShell什么是AzureCloudShell?什么是AzurePowerShell?什么是AzureCLI?对Azure交互的工具在AZ-900中的考点文末送书书籍介绍关于作者获取方式前言本文将深入浅出地探讨Micro

k8s(Kubernetes)集群部署--使用 kubeadm方式部署

k8s集群部署--使用kubeadm方式部署一、测试所需环境(三台均要执行)二、配置准备(三台均要执行)1.重命名hostname、添加hosts2.关闭防火墙、selinux与swap3.添加网桥过滤及内核转发配置文件4.同步时间5.安装ipset及ipvsadm三、安装docker(三台均要执行)1.配置Docke

微服务 第三章 Spring Cloud 简介

系列文章目录第一章Java线程池技术应用第二章CountDownLatch和Semaphone的应用第三章SpringCloud简介文章目录系列文章目录@[TOC](文章目录)前言:SpringCloud是一款基于SpringBoot实现的微服务框架1、SpringCloud的常用组件如下表所示。2、SpringBoo

Ubuntu20.04安装Nvidia显卡驱动、CUDA11.3、CUDNN、TensorRT、Anaconda、ROS/ROS2

1.更换国内源打开终端,输入指令:wgethttp://fishros.com/install-Ofishros&&.fishros选择【5】更换系统源,后面还有一个要输入的选项,选择【0】退出,就会自动换源。2.安装NVIDIA驱动这一步最痛心了家人们,网上的教程太多了,我总是想着离线安装,每次安装都无法开机,要不就

热文推荐