gpt4 book ai didi

ios - 无法从 GET 请求将数据附加到数组

转载 作者:行者123 更新时间:2023-11-28 13:43:26 25 4
gpt4 key购买 nike

我正尝试在 swift 中使用 Alamofire 库从 GET 请求加载数据,但无法从请求中附加数据。我正在尝试填充一个订单数组以加载到 UITableView 中。

我已经尝试了几种不同的方法来解决这个问题,但对我来说没有任何效果。我已经注释掉了我尝试的方法,因为有 2 个单独调用 fetchAll...Orders 并且第二个调用总是覆盖第一个,然后 tableView 加载了丢失的项目。

class DrinkOrdersTableViewController: UITableViewController {

var orders: [Order] = []

override func viewDidLoad() {
super.viewDidLoad()
navigationItem.title = "Current Orders"

}

override func viewWillAppear(_ animated: Bool) {

// fetchAllBeerOrders { orders in
// self.orders = orders!
// //print("Beer fetch: ", self.orders)
// self.tableView.reloadData()
// }

// fetchAllCocktailOrders { orders in
// self.orders = orders!
// //print("Cocktail fetch: ", self.orders)
// self.tableView.reloadData()
// }

fetchAllBeerOrders { orders in
self.orders.append(orders)
self.tableView.reloadData()
}

fetchAllCocktailOrders { orders in
self.orders.append(orders)
self.tableView.reloadData()
}

}

private func fetchAllCocktailOrders(completion: @escaping([Order]?) -> Void) {
Alamofire.request("http://127.0.0.1:4000/orders", method: .get)
.validate()
.responseJSON { response in
guard response.result.isSuccess else { return completion(nil) }
guard let rawInventory = response.result.value as? [[String: Any]?] else { return completion(nil) }
let currentOrders = rawInventory.compactMap { ordersDict -> Order? in
guard let orderId = ordersDict!["id"] as? String,
let orderStatus = ordersDict!["status"] as? String,
var pizza = ordersDict!["cocktail"] as? [String: Any] else { return nil }
pizza["image"] = UIImage(named: pizza["image"] as! String)

return Order(
id: orderId,
pizza: Pizza(data: pizza),
status: OrderStatus(rawValue: orderStatus)!
)

}
completion(currentOrders)
}

}

private func fetchAllBeerOrders(completion: @escaping([Order]?) -> Void) {
Alamofire.request("http://127.0.0.1:4000/orders", method: .get)
.validate()
.responseJSON { response in
guard response.result.isSuccess else { return completion(nil) }
guard let rawInventory = response.result.value as? [[String: Any]?] else { return completion(nil) }
let currentOrders = rawInventory.compactMap { ordersDict -> Order? in
guard let orderId = ordersDict!["id"] as? String,
let orderStatus = ordersDict!["status"] as? String,
var pizza = ordersDict!["pizza"] as? [String: Any] else { return nil }
pizza["image"] = UIImage(named: pizza["image"] as! String)

return Order(
id: orderId,
pizza: Pizza(data: pizza),
status: OrderStatus(rawValue: orderStatus)!
)

}
completion(currentOrders)
}
}

截至目前,我在上面的代码中遇到了这个错误:Cannot convert value of type '[Order]?'到预期的参数类型“Order”。此代码的理想结果是将从每个 GET 请求收集的数据附加到订单数组。我已验证 GET 请求正在运行并返回正确的数据。请帮助:]

最佳答案

您声明了 orders类型 [Order]并且您的获取方法编译 block 返回 [Order]? .如您所见,您无法转换 [Order]? 类型的值。到预期的参数类型 Order当你写 self.orders.append(orders) .

要解决这些问题,请在 fetch 方法调用中放置一个 guard unwrap。

fetchAllBeerOrders { orders in
guard let _orders = orders else { return }

self.orders.append(_orders)
self.tableView.reloadData()
}

fetchAllCocktailOrders { orders in
guard let _orders = orders else { return }

self.orders.append(_orders)
self.tableView.reloadData()
}

现在,您的代码中存在潜在的内存泄漏。 fetchAllBeerOrdersfetchAllCocktailOrders是带有编译 block 的异步方法。您不能使用对 self 的强引用这里。使用 weak以避免内存泄漏,例如:

fetchAllBeerOrders { [weak self] orders in
guard let _orders = orders else { return }

self?.orders.append(_orders)
self?.tableView.reloadData()
}

fetchAllCocktailOrders { [weak self] orders in
guard let _orders = orders else { return }

self?.orders.append(_orders)
self?.tableView.reloadData()
}

关于ios - 无法从 GET 请求将数据附加到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55738363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com