Извлечение данных JSON после внедрения веб-службы JSON - PullRequest
1 голос
/ 24 апреля 2020

Я изучаю Swift на Udemy, и JSON анализ данных заставляет меня испытывать трудности. Я создал два файла WebService.swift и OrderListViewModel.swift. Прежний ... как следует из названия, реализует запрос данных (node.js) от Glitch, а позже реализует View Model. Вот файлы:

`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)
            }

1 Ответ

1 голос
/ 24 апреля 2020

Вы вызываете функцию

Webservice().getAllOrders

и передаете в нее блок завершения

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

.

Блок завершения получит значение с именем orders типа [Order]?

и если orders не nil

if let orders = orders

Вы можете назначить свой класс var orders, который здесь объявлен

var orders = [OrderViewModel]

для нового массива, который, в свою очередь, содержит элементы типа OrderViewModel

Последний является результатом

orders.map(OrderViewModel.init)

и это также можно записать как

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