美文网首页
Swift 中的异步与并发

Swift 中的异步与并发

作者: yyggzc521 | 来源:发表于2022-01-22 16:58 被阅读0次

异步

异步在 iOS 里是一个常见的操作,例如要在网络请求后更新数据模型和视图。
但是当异步操作嵌套时,不仅容易出现逻辑错误,还可能会陷入回调地狱

先看下下面这段代码

func fetchThumbnail(for id: String, completion: @escaping (Result<UIImage, Error>) -> Void) {
    let request = thumbnailURLRequest(for: id)
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        if let error = error {
            completion(.failure(error))
        } else if (response as? HTTPURLResponse)?.statusCode != 200 {
            completion(.failure(FetchError.badID))
        } else {
            guard let image = UIImage(data: data!) else {
                completion(.failure(FetchError.badImage))
                return
            }
            image.prepareThumbnail(of: CGSize(width: 40, height: 40)) { thumbnail in
                guard let thumbnail = thumbnail else {
                    completion(.failure(FetchError.badImage))
                    return
                }
                completion(.success(thumbnail))
            }
        }
    }
    task.resume()
}

为了处理这些异步函数的结果,需要使用 completion 来通知调用方

使用 async 和 await 重构函数

func fetchThumbnail(for id: String) async throws -> UIImage {
    let request = thumbnailURLRequest(for: id)
    let (data, response) = try await URLSession.shared.data(for: request)
    guard (response as? HTTPURLResponse)?.statusCode == 200 else { throw FetchError.badID }
    let maybeImage = UIImage(data: data)
    guard let thumbnail = await maybeImage?.thumbnail else { throw FetchError.badImage }
    return thumbnail
}

步骤非常简单:

  1. 生成 request 请求,这是一个同步操作;
  2. 请求数据,try 标记可能抛出错误,await 标记潜在暂停点,这是一个异步操作;
  3. 判断返回状态码是否 200,不是则抛出错误;
  4. 生成原始图片,这是一个同步操作;
  5. 生成缩略图,await 标记潜在暂停点,无法生成则抛出错误,这是一个异步操作;
  6. 返回成功生成的缩略图。

如果并发?以及更多细节内容👉🏻参考资料

相关文章

  • WWDC21-Swift并发

    swift语言中的并发介绍 wwdc21-认识Swift中异步与等待 wwdc21-结构化并发

  • Swift 中的异步与并发

    异步 异步在 iOS 里是一个常见的操作,例如要在网络请求后更新数据模型和视图。但是当异步操作嵌套时,不仅容易出现...

  • WWDC21-Swif5.5特性早知道(并发)

    一、前言 WWDC21上,苹果宣布了Swift5.5新特性——并发!从此在语言层面而非库的层面完成了对并发(异步与...

  • 多线程处理(问题使用方法)

    一、同步与异步、串行与并发: 首先我们要明白:什么是同步、异步?什么是并发、串行?同步、异步是提交任务的一种方式,...

  • 并发编程之临界区\阻塞\非阻塞\死锁\饥饿\活锁

    本文介绍并发编程中的若干概念,实际上在笔者之前的文章中,已经介绍过很多概念。比如:并发与并行、同步与异步、锁与信号...

  • Swift 中的 async let

    Async let 是Swift并发框架的一部分,允许异步实例化一个常量。并发框架引入了async-await的概...

  • 网络编程中的并发与异步

    之前有用到socket编程中的select函数实现异步,现在要写一个raw socket 来实现本地流量监控,同时...

  • ios GCD概述

    GCD 容易混淆的术语 同步/异步/并发/串行 同步和异步: 决定要不要开启新的线程 并发与串行 决定了任务的执行...

  • Go语言学习五:异步、同步、锁

    一 、异步、同步控制 在Go中并行与并发是有区别的,详细请参考Go 并发 、并行、线程池, 通过信道的方式来实现同...

  • Swift - 并发

    并发 Swift 对于结构化的编写异步和并行代码有着原生的支持。异步代码可以被挂起并在之后继续执行,同一时间只能有...

网友评论

      本文标题:Swift 中的异步与并发

      本文链接:https://www.haomeiwen.com/subject/zzeuhrtx.html