Swift4-如何对数组的每个元素应用异步函数

时间:2019-06-03 05:12:43

标签: ios swift loops

** [编辑] **我有一个for循环,它应该从上到下依次遍历循环的每个步骤,然后回到顶部并再次重复这些步骤。但是,它没有转到最后一步(这是一个函数),而是从中间返回到第一步,获取所有参数,并在完成了从上到下的所有步骤循环之后,然后转到最后一步,并多次运行该函数,但只能使用从上一步获得的最后一个参数。

我试图将最后一步(函数)放在循环之外,但是在循环中,最后一个参数将覆盖先前的参数,而该函数将仅使用最后一个参数。

用于获取产品信息并将其添加到购物车的循环代码:

fill_between

函数“ addCartItem”的代码:

@IBAction func btnReorderTapped(_ sender: UIButton) {
    if !isReorderDisable {

        let orderItem = orderDetail.items

        func addToCart() {
            viewModel.addCartItem(success: {
                print("product added")
            }, failure: { (errorMessage) in
                self.showAlert(errorMessage)
                print("fail")
            })
        }

        var results: [CartItemData] = []

        for item in orderItem {

            let cartItem = CartItemData()

            cartItem.sku = item.sku
            cartItem.qty = item.qtyOrdered
            cartItem.name = item.name
            cartItem.price = item.price  

            results.append(cartItem)  
        }
        for i in 0...1 { // test two sets of value in results[i]
            viewModel.cartItem = results[i]
            addToCart()
        }
    }
}

预期的打印消息应为:

/**
 Add new item to existing shopping cart
 */
func addCartItem(success: @escaping () -> Void, failure: @escaping (_ errorMessage : String) -> Void) {
    cart.cartItem = cartItem
    cart.cartItem?.quote_id = "\(CartInfo.getCartID() ?? 0)"

    if ReachabilityUtil.shareInstance.isOnline() {
        beforeApiCall?()

        // IF CART NOT CARTE, CRATE THE CART AND RETRY CART ITEM ADD
        createCartData(success: { (_) in
            self.cart.cartItem?.quote_id = "\(CartInfo.getCartID() ?? 0)"
            // CHECK CART LIMIT BEFORE ADDING NEW ITEM INTO CART
            self.checkCartLimit(success: { (checkLimit) in
                if let limitErrors = checkLimit.limit_errors {
                    for limitError in limitErrors {
                        switch limitError.typeLimit {
                        case .cartItemAndTotalLimitExcced, .cartItemLimitExceed, .cartTotalLimitExceed:
                            failure(limitError.message)
                            return
                        default:
                            break
                        }
                    }
                }

                // ADD ITEM TO CART
                CartApiManager.sharedInstance.doAddCartItem(data: self.cart.toJSON(), completed: { (apiResponseHandler, error) in
                    self.afterApiCall?()

                // print("cartData-", self.cart)

                    if apiResponseHandler.isSuccess() {
                        // UPDATE CART DATA IN LOCAL DB
                        self.getCartData(success: { (_) in

                        }, failure: { (errorMessage) in
                            print("\(errorMessage)")
                        })

                        // UPDATE CART SUMMARY DATA IN LOCAL DB
                        self.getCartSummary(success: {

                        }, failure: { (errorMessage) in
                            print("\(errorMessage)")
                        })

                        success()
                    } else {
                        failure(apiResponseHandler.errorMessage())
                    }
                })
            }, failure: { (errorMessage) in
                self.cart.cartItem?.quote_id = "\(CartInfo.getCartID() ?? 0)"

                // CHECK LIMIT MAY BE FAILURE ON FIRST STAGE, SO WE ALLOWED TO ADD ITEM INTO CART
                CartApiManager.sharedInstance.doAddCartItem(data: self.cart.toJSON(), completed: { (apiResponseHandler, error) in
                    self.afterApiCall?()

                    if apiResponseHandler.isSuccess() {
                        // UPDATE CART DATA IN LOCAL DB
                        self.getCartData(success: { (_) in

                        }, failure: { (errorMessage) in
                            print("\(errorMessage)")
                        })

                        // UPDATE CART SUMMARY DATA IN LOCAL DB
                        self.getCartSummary(success: {

                        }, failure: { (errorMessage) in
                            print("\(errorMessage)")
                        })

                        success()
                    } else {
                        failure(apiResponseHandler.errorMessage())
                    }
                })
                return
            })
        }, failure: { (errorMessage) in
            failure(errorMessage)
        })
    }
}

应该在购物车中添加两个项目。但是,

实际的打印消息是:

sku- xxxxxx
final- CartItemData {
    sku = xxxxxx;
    qty = 1;
    name = nnnnnn;
    price = 100;
    product_type = ;
    quote_id = ;
}
cartData- CartItemData {
    sku = xxxxxx;
    qty = 1;
    name = nnnnnn;
    price = 100;
    product_type = ;
    quote_id = ;
}
product added
sku- yyyyyy
final- CartItemData {
    sku = yyyyyy;
    qty = 1;
    name = mmmmmm;
    price = 200;
    product_type = ;
    quote_id = ;
}
cartData- CartItemData {
    sku = yyyyyy;
    qty = 1;
    name = mmmmmm;
    price = 200;
    product_type = ;
    quote_id = ;
}
product added

所以最后添加的项目只是第二个项目。

请任何人告诉我如何将异步函数“ addCartItem”应用于数组“结果”中的每个元素?非常感谢你!

1 个答案:

答案 0 :(得分:0)

  • 由于viewModel.addCartItem在该API调用中具有使用cartItem模型的api调用,因此解决方案是将cartItem传递给addCartItem函数,如下所示:一个单独的参数。
  • 这是因为api调用是异步发生的,所以这就是为什么他们都看到您分配给viewModel的最后一个cartItem的原因。

如果将调用addCardItem函数的方式更改为:

func addCartItem(_ cartItem: CartItemData, success: @escaping () -> Void, failure: @escaping (_ errorMessage : String) -> Void) {
   // here user cartItem instead of self.cartItem
}

,您应该替换以下呼叫:

viewModel.addCartItem(success: {
            print("product added")
            }, failure: { (errorMessage) in
                self.showAlert(errorMessage)
            print("fail")
            })

作者:

viewModel.addCartItem(cartItem, success: {
            print("product added")
            }, failure: { (errorMessage) in
                self.showAlert(errorMessage)
            print("fail")
            })