如何将所有响应从API返回到我的Swift应用

埃文·古铁里奥斯(Evan Gutierritos Walker)

我正在学习Swift,并且在这里看到了一个示例https://matteomanferdini.com/network-requests-rest-apis-ios-swift/,我正在尝试更改适用于我的代码。

这就是原始代码的样子

struct Wrapper<T: Decodable>: Decodable {
    let items: [T]?
}


protocol NetworkRequest: AnyObject {
    associatedtype ModelType
    func decode(_ data: Data) -> ModelType?
    func load(withCompletion completion: @escaping (ModelType?) -> Void)
}

extension NetworkRequest {
    fileprivate func load(_ url: URLRequest, withCompletion completion: @escaping (ModelType?) -> Void) {
        let session = URLSession(configuration: .default, delegate: nil, delegateQueue: .main)
        let task = session.dataTask(with: url, completionHandler: { [weak self] (data: Data?, response: URLResponse?, error: Error?) -> Void in

            if let error = error {
                print("Error: \(error)")
            }

            guard let data = data else {
                completion(nil)
                return
            }

            completion(self?.decode(data))
        })
        task.resume()
    }
}

class APIRequest<Resource: APIResource> {
    let resource: Resource

    init(resource: Resource) {
        self.resource = resource
    }
}

extension APIRequest: NetworkRequest {
    func decode(_ data: Data) -> [Resource.ModelType]? {
        let wrapper = try? JSONDecoder().decode(Wrapper<Resource.ModelType>.self, from: data)
        return wrapper?.items
    }

    func load(withCompletion completion: @escaping ([Resource.ModelType]?) -> Void) {
        load(resource.request, withCompletion: completion)
    }
}

但是我需要将结构更改Wrapper

struct Wrapper<T: Decodable>: Decodable {
    let items: [T]?
    let response: Bool?
    let message: String?
}

然后返回itemsresponsemessage不仅仅是items

瓦迪安

在这种情况下,您根本不需要协议,因为您想要获取根对象。

这样就足够了

struct Wrapper<T: Decodable>: Decodable {
    let items: [T]
    let response: Bool
    let message: String
}

class NetworkRequest {
    func load<T : Decodable>(_ request: URLRequest, withCompletion completion: @escaping (Result<Wrapper<T>,Error>) -> Void) {
        let session = URLSession(configuration: .default, delegate: nil, delegateQueue: .main)
        let task = session.dataTask(with: request) { data, _, error in
            if let error = error {
                completion(.failure(error))
            } else {
                completion( Result {try JSONDecoder().decode(Wrapper<T>.self, from: data!)})
            }
        }
        task.resume()
    }
}

完成处理程序返回一个Result对象,如果成功,则返回包装器对象,如果失败,则返回所有错误。

在包装器结构中,声明所有属性均为非可选,以获取错误消息,并仅将其更改为真正可以为可选的nil

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将所有请求的500响应返回到Varnish级别的特定文件?

来自分类Dev

AWS API网关+ SQS + Lambda +将响应从Lambda返回到API

来自分类Dev

AWS API网关+ SQS + Lambda +将响应从Lambda返回到API

来自分类Dev

如何将 json 数组返回到我在 Codeigniter 中的视图

来自分类Dev

在脚本完成之前将响应从php返回到ajax

来自分类Dev

Swift:如何返回到我的UIViewController的相同实例

来自分类Dev

如何将JSON响应返回到Rails应用json.parse意外令牌

来自分类Dev

如何将JSON响应从公共API转换为JSON对象?

来自分类Dev

如何将Apple的UIImage + Effects类别导入到我的Swift应用程序中?

来自分类Dev

如何将 URL 中的信息提取到我的 swift 应用程序中

来自分类Dev

如何将新所有者添加到我的AWS账户?

来自分类Dev

将GET请求的响应从C ++返回到QML字符串

来自分类Dev

Angular5:将 HttpClient 响应从服务返回到组件?

来自分类Dev

如何将Office 365 REST API集成到我的Ruby on Rails应用程序中?

来自分类Dev

如何搜索外部URL的HTML源并将结果返回到我的应用程序?

来自分类Dev

如何确保在触发 startActivity 后后退按钮返回到我的应用程序?

来自分类Dev

如何将图像内置到我的应用中

来自分类Dev

如何将Web API部署到我的Web主机?

来自分类Dev

如何将数组从php返回到javascript中的ajax响应

来自分类Dev

如何将数据作为函数参数中的响应返回到对象(如jquery ui autocomplete)

来自分类Dev

如何将 qrcode 返回到 dataurl 编码以进行 json 响应

来自分类Dev

如何将值返回到数组

来自分类Dev

我如何从Quickbooks OAuth中出现的弹出窗口中将控件返回到我的应用程序

来自分类Dev

如何从root登录返回到我的用户登录?

来自分类Dev

Google Apps 脚本:如何设置返回到我的页面?

来自分类Dev

我应该如何从.NET MVC应用程序中的所有函数返回通用响应和响应代码?

来自分类Dev

如何将所有HTTP请求记录到我的Sails.js服务器?

来自分类Dev

在Next.js中:如何将所有空路由重定向到我选择的路由

来自分类Dev

如何将所有电子邮件从gmail帐户下载到我的本地计算机

Related 相关文章

  1. 1

    如何将所有请求的500响应返回到Varnish级别的特定文件?

  2. 2

    AWS API网关+ SQS + Lambda +将响应从Lambda返回到API

  3. 3

    AWS API网关+ SQS + Lambda +将响应从Lambda返回到API

  4. 4

    如何将 json 数组返回到我在 Codeigniter 中的视图

  5. 5

    在脚本完成之前将响应从php返回到ajax

  6. 6

    Swift:如何返回到我的UIViewController的相同实例

  7. 7

    如何将JSON响应返回到Rails应用json.parse意外令牌

  8. 8

    如何将JSON响应从公共API转换为JSON对象?

  9. 9

    如何将Apple的UIImage + Effects类别导入到我的Swift应用程序中?

  10. 10

    如何将 URL 中的信息提取到我的 swift 应用程序中

  11. 11

    如何将新所有者添加到我的AWS账户?

  12. 12

    将GET请求的响应从C ++返回到QML字符串

  13. 13

    Angular5:将 HttpClient 响应从服务返回到组件?

  14. 14

    如何将Office 365 REST API集成到我的Ruby on Rails应用程序中?

  15. 15

    如何搜索外部URL的HTML源并将结果返回到我的应用程序?

  16. 16

    如何确保在触发 startActivity 后后退按钮返回到我的应用程序?

  17. 17

    如何将图像内置到我的应用中

  18. 18

    如何将Web API部署到我的Web主机?

  19. 19

    如何将数组从php返回到javascript中的ajax响应

  20. 20

    如何将数据作为函数参数中的响应返回到对象(如jquery ui autocomplete)

  21. 21

    如何将 qrcode 返回到 dataurl 编码以进行 json 响应

  22. 22

    如何将值返回到数组

  23. 23

    我如何从Quickbooks OAuth中出现的弹出窗口中将控件返回到我的应用程序

  24. 24

    如何从root登录返回到我的用户登录?

  25. 25

    Google Apps 脚本:如何设置返回到我的页面?

  26. 26

    我应该如何从.NET MVC应用程序中的所有函数返回通用响应和响应代码?

  27. 27

    如何将所有HTTP请求记录到我的Sails.js服务器?

  28. 28

    在Next.js中:如何将所有空路由重定向到我选择的路由

  29. 29

    如何将所有电子邮件从gmail帐户下载到我的本地计算机

热门标签

归档