当前位置: 首页 > 知识库问答 >
问题:

变量没有快速更新[重复]

王飞英
2023-03-14
class ProductDecoer: ObservableObject {

  @Published var productName: String = ""

  func checkBarCode(barcode: String) -> String {

    let api = <url>
    let barcode = barcode
    let format = ".json"
    let url = URL(string: api + barcode + format)

    URLSession.shared.dataTask(with: url!) { [self] data, response, error in
      if let data = data {
        if let jsonString = String(data: data, encoding: .utf8) {
          productName = self.getProductInfo(json: jsonString)
          print("checkBarCode: " + self.productName) // --> print correctly
        }
      }
    }.resume()

    self.productName = productName
    print("return: " + self.productName) // --> is empty
    return self.productName
  }

  func getProductInfo(json: String) -> String {
    let jsonData = json.data(using: .utf8)!
    let productInfo: ProductInfo = try! JSONDecoder().decode(ProductInfo.self, from: jsonData)
    self.productName = productInfo.product_name
    print("AAA: " + self.productName)
    print("Prodotto: " + productInfo.product_name)

    productName = productInfo.product_name
    print("CC: " + productName)

    return productName
  }

  struct ProductInfo: Codable {

    var code: String
    var product_name: String

    enum CodingKeys: String, CodingKey {
      case code
      case product

      enum ProductCodingKeys: String, CodingKey {
        case product_name
      }
    }

    init(from decoder: Decoder) throws {
      let rootContainer = try decoder.container(keyedBy: CodingKeys.self)
      let productContainer = try rootContainer.nestedContainer(keyedBy: CodingKeys.ProductCodingKeys.self, forKey: .product)

      code = try rootContainer.decode(String.self, forKey: .code)
      product_name = try productContainer.decode(String.self, forKey: .product_name)

      print("BB: " + product_name)
    }

    func encode(to encoder: Encoder) throws {
      var rootContainer = encoder.container(keyedBy: CodingKeys.self)
      var productContainer = rootContainer.nestedContainer(keyedBy: CodingKeys.ProductCodingKeys.self, forKey: .product)

      try rootContainer.encode(code, forKey: .code)
      try productContainer.encode(product_name, forKey: .product_name)
    }
  }

}

共有1个答案

孙昂然
2023-03-14

urlsession.shared.datatask是一个异步函数。这意味着它独立执行,并在将来完成一个不确定的时间。

在它后面的{}中向它提供的内容称为完成处理程序或回调函数--这是datatask在执行结束后调用的代码,因此依赖于返回值的任何事情都需要在闭包中进行。

不幸的是,这意味着您不能直接从checkBarcode函数返回String。但是,您也可以为它创建一个回调函数:

func checkBarCode(barcode: String, completion: @escaping (String) -> Void) {
        
        let api = "URL"
        let barcode = barcode
        let format = ".json"
        let url = URL(string: api + barcode + format)
        
        URLSession.shared.dataTask(with: url!) { [self] data, response, error in
            if let data = data {
                if let jsonString = String(data: data, encoding: .utf8) {
                    self.productName = self.getProductInfo(json: jsonString)
                    print("checkBarCode: " + self.productName)
                    completion(self.productName)
                }
            }
        }.resume()
    }
checkBarCode(barcode: "") { productName in 
  //do something that depends on the value
}
 类似资料:
  • 问题内容: 我正在尝试使用NSLocalizedString本地化我的应用程序。当我导入XLIFF文件时,大多数工作都像一个超级按钮,但是有些却没有,有些字符串没有本地化。我注意到问题出在NSLocalizedString中,其中包含一些变量,例如: 要么 也许这不是这类东西的正确语法。有人可以向我解释如何迅速做到这一点?非常感谢你。 问题答案: 您可以在中使用format参数,因此您的示例如下所

  • 问题内容: 这里发生了什么事? 它抛出一个错误,说 我正在做的是将值重新分配给一个已经声明的变量。 问题答案: 将新值分配给现有变量时,请从第二条语句中删除。 当您像在第一个语句中那样第一次执行简短声明和赋值时使用。

  • 问题内容: 我知道这个答案已经以其他形式发布在这里,但是我想了解更多有关迅速覆盖实例变量的信息。 假设我有这段代码 好。从我读到的内容来看,常量需要覆盖前缀。其他答案说我应该声明setter和getter?为什么?我真的不在乎这两个。我只需要替换值即可。我真的不能使用重写,因为我是从UIView继承的,这可能很危险(我认为)。 任何建议都欢迎。 问题答案: 如您所说,您不能简单地在子类中重新定义常

  • 问题内容: 我在检测有人何时按下音量调高按钮时遇到问题。目前,我只是播放文件,但我想知道用户何时按下按钮以在音量变化时显示警报。我正在开发Swift,并且正在使用AVFoundation创建此播放器。目前,我找不到适用于Swift的东西。我是这种语言的新手。 问题答案: 这应该可以解决问题。

  • 问题内容: 我试图设置一个变量,该变量位于该闭包内部的闭包外部,但最终不会被设置。然而,我设置变量的值 是 正在打印到控制台。同样,在设置返回变量并自行打印之后,将正确的值打印到控制台。当我返回变量时就会出现问题。其值与初始化时的值相同。这是一些伪代码: 这是不起作用的实际代码: 问题答案: .observeSingleEvent正在异步工作。 您可以执行以下操作: 然后,您可以在任何需要的地方使

  • 问题内容: jQuery的 我正在发出一个AJAX请求,该请求会使用服务器的响应来更新变量()的值。这是我正在使用的代码: 问题是的值仍然是一个空字符串。我知道这不是服务器端脚本的问题,因为我会收到错误警报,或者至少得到string 。 这是一个演示问题的JSFiddle:http : //jsfiddle.net/GGDX7/ 为什么不变的价值? 纯JS 我正在发出一个AJAX请求,该请求会使用