如何使用 swift 5 URLSession 中引入的新结果类型?

2023-12-12

Swift 5 引入了新的 Result 类型来处理异步函数的结果。我想知道如何在 URLSession 中使用这个新的结果类型。

我有以下代码。

func getCategorByAPI()
    {
        //Base Url is from an static variable
        let url = URL(string: URLManager.aPIBaseURL+"category")!
        var request  = URLRequest(url: url)
        request.httpMethod = "GET"
        let boundary = "Boundary-\(UUID().uuidString)"
        request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

        let task = URLSession.shared.dataTask(with: request as URLRequest) {
            data, response, error in

            if error != nil {
                //print("error=\(error)")
                return
            }

            do {
                let json = try JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary
                print(json)
            }catch
            {
                print(error)
            }

        }

        task.resume()
    }

我如何使用 swift 5 结果类型重写这个函数?


您想要创建一个enum指定结果中可能的情况(例如成功或失败)。然后你添加一个完成到你的getCategorByAPI()类型的方法Result<Data, Error>。从那里,在 url 会话内部,您将调用完成处理程序,传入data on .success or the error on .failure.

您还可以做一些很酷的事情,例如覆盖结果get()方法和扩展Result解码你的数据:D

一探究竟:

enum Result<Success, Error: Swift.Error> {
    case success(Success)
    case failure(Error)
}

// override the Result.get() method
extension Result {
    func get() throws -> Success {
        switch self {
        case .success(let value):
            return value
        case .failure(let error):
            throw error
        }
    }
}

// use generics - this is where you can decode your data
extension Result where Success == Data {
    func decoded<T: Decodable>(using decoder: JSONDecoder = .init()) throws -> T {
        let data = try get()
        return try decoder.decode(T.self, from: data)
    }
}


func getCategorByAPI(completion: (Result<Data, Error>) -> Void)
{
    // You might want to stick this into another method
    let url = URL(string: URLManager.aPIBaseURL+"category")!
    var request  = URLRequest(url: url)
    request.httpMethod = "GET"
    let boundary = "Boundary-\(UUID().uuidString)"
    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

    URLSession.shared.dataTask(with: request as URLRequest) {
        data, response, error in

        if error != nil {
            completion(.failure(error))
            return
        }

        if !(200...299).contains(httpResponse.statusCode) && !(httpResponse.statusCode == 304) {
            let httpError = // ... convert httpResponse.statusCode into a more readable error
                completion(.failure(httpError))
        }

        if let data = data {
            completion(.success(data))
        }
        }.resume()
}

我还没有测试过上面的内容,但在当前的项目中实现了类似的东西。以下是我阅读的一些文章以了解如何实施:

https://www.hackingwithswift.com/articles/161/how-to-use-result-in-swift
https://medium.com/@pavlepesic/how-to-use-swift-5-result-with-codable-protocol-824c9a951af9

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 swift 5 URLSession 中引入的新结果类型? 的相关文章

  • 下载视频并保存至手机相册

    功能介绍 需要将转码后的视频 小于20MB 通过APP下载至手机相册 可以将小视频分享至微信传播 1 通过服务器转码视频 或者很多云服务商都会提供这个功能 2 通过APP下载至手机相册 这个是咱们需要做的事 主要技术 用到 URLSessi
  • Swift 原生网络请求

    iOS HTTP请求原生组要的类是URLSession 是一个单例类 例1 GET func makeLogon 构建URL let url URL URL string https xxx xxx API xxx 发送HTTP请求的的se
  • SwiftUI WKWebView 检测 url 更改

    我是一个学得很快的人 我使用 SwiftUI 它是一个结构 我必须实现一个 WKWebView 其中 url 是动态变化的 我必须捕获这些不断变化的网址 但我尝试过的解决方案不起作用 例如 https stackoverflow com a
  • 如何在 Swift 中存根 URLSession?

    我一直在关注这个tutorial存根URLSession 这个例子是通过创建一个协议并扩展现有协议来完成的URLSession protocol URLSessionProtocol typealias DataTaskResult Dat
  • selectItem 时的 Collection View 布局错误 (Swift 5)

    从 viewDidLoad 中选择单元格后 布局发生变化 选择单元格之前 选择单元格后 let indexPath IndexPath row SelectedFolderIndex section 0 collectionView sel
  • 纠结于如何使用 api 响应进行调用以从不同的链接检索响应

    我目前在使用 PokeApi 时遇到问题 我有代码可以让我查看 Pokemon 的名称以及 Pokemon 的其他 JSON 的 URL 但我不太确定如何检索该数据 这是我到目前为止所拥有的 这是 api 的链接 让 pokeList im
  • 将 CURL 转换为 URLRequest

    我正在尝试将 Swagger 给我的以下卷曲请求转换为 URLRequest curl X GET header Accept application json header Authorization key ttn account v2
  • ITMS-90429:无效的 Swift 支持 - 文件 libswiftDarwin.dylib、libswiftMetal.dylib、

    当我想在 Appstore Connect 上发布我的存档时 我遇到了 Xcode 12 3 swift 5 和 cocoapods 1 10 1 版本的问题 一切都很顺利 但是一旦应用程序发送 我就会收到一封来自 App Store Co
  • 防止用户找到已阻止他们的用户 Firebase

    在我的应用程序中 我不希望已被其他用户阻止的用户找到此类用户 假设用户 1 屏蔽了用户 2 当 user2 然后搜索应用程序内的所有用户时 我希望 user2 找到除 user1 之外的所有用户 因为 user1 已阻止 user2 就像
  • SceneKit 在 Xcode 12 中不会填满屏幕

    我正在尝试使用 SceneKit 进行练习并制作 IOS 游戏 在 Xcode 12 Beta 5 中 但无论我做什么 SceneView 都不会填满屏幕 这是使用 SceneKit 启动游戏时的默认代码 当我使用 Xcode 11 时 它
  • 多点连接 - 在 Swift 5 中获取文件传输(互联网)速度和文件大小

    我正在点对点传输照片 一切正常 但我无法获得照片 文件 传输速度 例如互联网速度 与MB 一样 文件也被传输 其次我想获取该文件的大小 我们使用数据格式传递照片MCSession 由于隐私原因 我无法在此处添加项目代码 但我将分享我关注的参
  • SwiftUI 共享表导致 iPad 崩溃

    我正在关注这个教程https jeevatamil medium com how to create share sheet uiactivityviewcontroller in swiftui cef64b26f073 https je
  • 如何检测 iOS 14 中是否授予本地网络权限

    iOS 14 如何检测用户是否在应用程序中授予了本地网络权限 如果用户拒绝权限并重定向到操作系统设置以授予权限 我必须显示错误屏幕 苹果是否提供了类似位置许可之类的查找方式 我编写了这个类 如果您不是使用 iOS 14 2 则可以使用该类
  • 如何模拟 URLSession.DataTaskPublisher

    我该如何嘲笑URLSession DataTaskPublisher 我有课Proxy需要注入一个URLSessionProtocol protocol URLSessionProtocol func loadData from url U
  • Swift 5 结果类型

    苹果在 Swift 5 中引入了Result类型 它是具有两种情况的通用枚举 public enum Result
  • Swift 中的@dynamicCallable 是什么?

    来自苹果的文档 The dynamicCallable属性让你可以调用named types就像你打电话一样 使用简单语法糖的函数 主要用例是动态语言互操作性 你为什么要使用 dynamicCallable而不是直接方法 dynamicCa
  • 直接渲染CGImage(而不是UIImage)?

    我正在做一个CGImage func otf gt CGImage 这是渐变上的贝塞尔蒙版 所以 the path let p UIBezierPath p moveTo etc the mask let m CAShapeLayer se
  • '迭代时不能对不可变值使用变异 getter:'self' 是不可变的'?

    有谁知道为什么self indexCount in the ForEach给出了错误Cannot use mutating getter on immutable value self is immutable错误 我可以提供aView w
  • SwiftUI 如何像 UIKit 中那样为 NavigationBar titleView 设置图像?

    我想在 SwiftUI 中的 NavigationBar 的 titleView 中设置图像 就像我们在 UIKit 中所做的那样 navigationItem titleView UIImageView image UIImage nam
  • 可以转换为 Swift 5

    我在 Xcode 10 2 中收到此警告 可以转换为 Swift 5 当我单击此错误时 它会打开此窗口 当我们点击Next会发生什么 swift 的当前版本是 swift5 仅在 Xcode 10 2 中受支持 而您在 Xcode 10 2

随机推荐