简体   繁体   English

React Native Swift Escaping 关闭

[英]React Native Swift Escaping closure

I am trying to implement a native module in React native using Swift for IOS.我正在尝试使用 Swift 为 IOS 在 React native 中实现本机模块。

I have a function getRandomFoodWithCompletionHandler() Where I am trying to fetch something from the API and then sending it back to JS through the bridge using promises.我有一个 function getRandomFoodWithCompletionHandler()我试图从 API 中获取一些东西,然后使用承诺通过桥将它发送回 JS。 I use resolve:RCTPromiseResolveBlock function, but when I use it I have an error Escaping closure captures non-escaping parameter 'resolve'我使用resolve:RCTPromiseResolveBlock function,但是当我使用它时出现错误Escaping closure captures non-escaping parameter 'resolve'

在此处输入图像描述


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()
  }

Make your resolve: RCTPromiseResolveBlock parameter an escaping block: resolve: RCTPromiseResolveBlock参数一个 escaping 块:

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

An "escaping" block is essentially a block that can be called even when the original function has already finished executing, eg when it's an asynchronous completion handler. “转义”块本质上是一个即使在原始 function 已经完成执行时也可以调用的块,例如,当它是一个异步完成处理程序时。 In Swift it's necessary to distinguish such a situation because of memory allocations/deallocations.在 Swift 中,由于 memory 分配/释放,有必要区分这种情况。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM