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

标签 ios arrays swift xcode alamofire

我正尝试在 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/

相关文章:

ios - 消除在 Swift 中绘制 UIBezierPath 平滑线时的滞后延迟

ios - 向可滚动的 UITextView 添加渐变背景

swift - 如何在 switch 语句中解包双选项 -- Swift

iphone - 如何在没有预乘 alpha 的情况下获得真正的 RGBA 或 ARGB 颜色值?

ios - 使用另一行时模糊 UIPickerView 行之一

ios - Swift:无法从 uiCollectionView 中的 extensioncontext 打开 url?

iphone - 尝试与 iPhone 应用程序集成时,Google plus SDK 会发出链接器错误

java - 从数组列表中获取数组项

php - MYSQL 按拆分数组分组

javascript - 同一变量的返回值和日志不匹配