实施 JSON 网络服务后获取 JSON 数据
Fetching JSON data after implementing JSON web service
我正在 Udemy 上学习 Swift,JSON 数据解析让我很吃力。我创建了两个文件 WebService.swift
和 OrderListViewModel.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))
}
我正在 Udemy 上学习 Swift,JSON 数据解析让我很吃力。我创建了两个文件 WebService.swift
和 OrderListViewModel.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))
}