我正尝试在 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()
}
现在,您的代码中存在潜在的内存泄漏。 fetchAllBeerOrders
和 fetchAllCocktailOrders
是带有编译 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/