实施 JSON 网络服务后获取 JSON 数据

Fetching JSON data after implementing JSON web service

我正在 Udemy 上学习 Swift,JSON 数据解析让我很吃力。我创建了两个文件 WebService.swiftOrderListViewModel.swift。前者是...顾名思义,实现来自 Glitch 的数据请求 (node.js),而后者则是实现视图模型。以下是文件:

`WebService.swift`:



import Foundation

class Webservice {

    func getAllOrders(completion: @escaping ([Order]?) -> ()) {

        guard let url = URL(string: "https://island-bramble.glitch.me/orders") else {
            completion(nil)
            return
        }

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

            guard let data = data, error == nil else {
                DispatchQueue.main.async {
                  completion(nil)
                }

                return

            }


            let orders = try? JSONDecoder().decode([Order].self, from: data)
            DispatchQueue.main.async {
                completion(orders)
            }

       }.resume()

    }
}

我合理地理解这里发生的事情。我无法理解下面发生的部分。

`OrderListViewModel.swift`:

import Foundation


    class OrderListViewModel: ObservableObject {


        var orders = [OrderViewModel]()

        init() {
            fetchOrders()
        }
        func fetchOrders() {

            Webservice().getAllOrders { orders in
                if let orders = orders {
                    self.orders = orders.map(OrderViewModel.init)
            }

            }
        }
    }

    class OrderViewModel {

        let id = UUID()

        var order: Order
        init (order: Order) {
            self.order = order
        }
        var name: String {
            return self.order.name
        }
        var size: String {
            return self.order.size
        }
        var coffeeName: String {
            return self.order.coffeeName
        }
        var total: Double {
            return self.order.total
        }
    }

fetchOrders() 如何获取 orders。更具体地说,这个代码块(闭包)是如何获取 orders 的?或者,如果从远程服务器获取的数据作为参数传递给回调函数的参数,下面的代码如何检索它?

 Webservice().getAllOrders { orders in
                if let orders = orders {
                    self.orders = orders.map(OrderViewModel.init)
            }

你调用一个函数

Webservice().getAllOrders

并传递一个完成块

{ orders in
    if let orders = orders {
          self.orders = orders.map(OrderViewModel.init)
}

进入其中。

完成块将接收类型为 [Order]?

的名为 orders 的值

如果 orders 不是 nil

if let orders = orders

您可以分配此处声明的 class 变量 orders

var orders = [OrderViewModel]

到新数组,该数组又包含 OrderViewModel

类型的元素

后者是

的结果

orders.map(OrderViewModel.init)

也可以写成

orders.forEach { order in 
      self.orders.append(OrderViewModel.init(order))
}