首页 > 其他分享 >Swift 5.5之Continuation

Swift 5.5之Continuation

时间:2023-03-14 19:45:17浏览次数:41  
标签:异步 5.5 resume Continuation 代码 data 使用 Swift

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

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

  1. 导入Continuation模块

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

import Continuation
  1. 定义异步函数

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

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)方法,它可以用于在异步任务完成后继续执行代码,并将结果传递给下一个操作。

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,您可以更加方便地管理异步任务的结果,并将异步代码与同步代码结合起来,使得代码更加简洁和易于理解。

标签:异步,5.5,resume,Continuation,代码,data,使用,Swift
From: https://www.cnblogs.com/duzhaoquan/p/17216058.html

相关文章

  • Swift 中 extension 的使用
    在Swift中,extension是一种非常有用的语言特性,它可以为一个已有的类型(包括类、结构体和枚举)添加新的属性、方法、下标和协议等功能,而无需修改原始类型的定义。使用exten......
  • Swift 中的static 和 class 关键字使用及区别
    在Swift中,static和class关键字都可以用来修饰类的属性和方法,但它们之间有三个主要的区别:继承性:使用class修饰的属性和方法可以被子类重写,而使用static修饰的属......
  • Swift与Objective-C常量定义的不同
    在Objective-C中,使用const关键字定义的常量是在编译时被解析的,它们的值是静态的,不能在运行时改变。同时,这种方式定义的常量需要通过C语言的方式来访问和使用。而在......
  • 22:swift-协议
      正文 /*22:协议1:协议为方法、属性、以及其他特定的任务需求或功能定义蓝图。协议可被类、结构体、或枚举类型采纳以提供所需功能的具体实现。满足......
  • 【质因数分解算法详解】C/Java/Go/Python/JS/Dart/Swift/Rust等不同语言实现
    关于质因数分解算法的不同语言实现,通过实例来看不同语言的差异什么是质因数算法?即任意一个合数可以分解为多个质数相乘。例如:20=2*2*545=3*3*5210=2*......
  • swift 下标 subscript
    类、结构体、和枚举可以定义下标。它可以作为访问集合,列表或序列成员元素的快捷方式。你可以使用下标通过索引值来设置或检索值而不需要为设置和检索分别使用实例方法。你可......
  • swift 函数编程
    读入一个文本,确定所有单词的使用频率并从高到底排序,打印出所有单词以及其频率列表先不解决频率问题先看下不使用高阶函数//:AUIKitbasedPlaygroundforpresentinguse......
  • swift 属性观察者 willset didset 类型属性 class static
    willSet会在该值被存储之前被调用didSet会在一个新值被存储后调用如果你实现了一个willSet观察者,新的属性值会以常量形式参数传递。你可以在你的willSet实现中为这个参数......
  • swift 在实例方法中修改属性 mutating
    结构体和枚举是值类型,默认情况下。值类型不能被自身的实例方法修改。你可以在选在在func关键字前放一个mutating关键字来指定可以修改属性//:AUIKitbasedPlaygroundfor......
  • swift逃逸闭包和自动闭包
    当闭包作为一个实际参数传递给一个函数的时候,并且它会在函数返回之后调用我们就说这个闭包逃逸了,当你声明一个接受闭包作为形式参数的函数时,你可以在形式参数前写@escaping......