代码之家  ›  专栏  ›  技术社区  ›  fristyr

快速逃离关闭

  •  0
  • fristyr  · 技术社区  · 2 年前

    我正在尝试使用Swift for IOS在React native中实现一个本机模块。

    我有一个功能 getRandomFoodWithCompletionHandler() 我试图从API中获取一些东西,然后使用promises通过桥将其发送回JS。 我用 解决方法:RCTPromiseResolveBlock 函数,但当我使用它时,我有一个错误 转义闭包捕获非转义参数“resolve”

    enter image description here

    
    struct Food: Identifiable, Decodable {
          var id: Int
          var uid: String
          var dish: String
          var description: String
          var ingredient: String
          var measurement: String
      }
    
      @objc
      func getRandomFoodWithCompletionHandler(_ resolve:RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) {
          guard let url = URL(string: "https://random-data-api.com/api/food/random_food") else { fatalError("Missing URL") }
    
          let urlRequest = URLRequest(url: url)
    
          let dataTask = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in
              if let error = error {
                  print("Request error: ", error)
            
                  return
              }
    
              guard (response as? HTTPURLResponse)?.statusCode == 200 else { return }
              guard let data = data else { return }
              do {
                   let decodedFood = try JSONDecoder().decode(Food.self, from: data)
                   print("Completion handler decodedFood", decodedFood)
                   
                   resolve(decodedFood)
                
               } catch {
                   print("Error decoding", error)
               }
          }
    
          dataTask.resume()
      }
    
    1 回复  |  直到 2 年前
        1
  •  0
  •   Sulthan    2 年前

    做你的 resolve: RCTPromiseResolveBlock 参数a转义块:

    func getRandomFoodWithCompletionHandler(
        _ resolve: @escaping RCTPromiseResolveBlock,
        reject: @escaping RCTPromiseRejectBlock
    ) {
    

    “转义”块本质上是一个即使在原始函数已经完成执行时也可以调用的块,例如,当它是异步完成处理程序时。 在Swift中,由于内存分配/释放,有必要区分这种情况。