如何将 Swift Promise 桥接到 React Native

hax*_*nel 2 bridge promise swift react-native react-native-ios

我正在将 iOS 原生 SDK 集成到 React-Native 中。SDK.getCardData我想从 RN 中使用一个名为的函数。我的第一次尝试是在闭包内调用resolveand :reject

import Foundation
import SDK

@objc(SwiftComponentManager)
class SwiftComponentManager: NSObject {
  
  @objc
  func getCardData(_ resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
    let cardId: String = "test"
    let secret: String = "test"

    SDK.getCardData(cardId, secret: secret) { (cardData, error) in
      if (error != nil) {
        reject(String(format: "Card data request failed: %@", error!.localizedDescription))
      } else {
        let pan = cardData!.pan
        let cvv = cardData!.cvv

        resolve(String(format: "Card data fetched successfully, pan: %@, cvv: %@", pan, cvv))
      }
    }
  }

  @objc func testMethod() -> Void {
    print("This Does appear")
  }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会引发以下错误:escaping closure captures non-escaping parameter 'resolve'

第二次尝试:

import Foundation
import SDK
import Promises

@objc(SwiftComponentManager)
class SwiftComponentManager: NSObject {
  
  @objc
  func getCardData(_ resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Promise<CardData?> {
    let cardId: String = "test"
    let secret: String = "test"
    let promise = Promise<CardData?>()

    SDK.getCardData(cardId, secret: secret) { (cardData, error) in
      if (error != nil) {
        promise.reject(error)
      } else {
        let pan = cardData!.pan
        let cvv = cardData!.cvv

        promise.resolve(cardData)
      }
    }
    
    return promise
  }

  @objc func testMethod() -> Void {
    print("This Does appear")
  }
}

Run Code Online (Sandbox Code Playgroud)

如何正确调用resolve& reject?函数返回很重要Void更多内容请参见此处

hax*_*nel 6

找到答案,只需在参数中添加@escaping:

@objc func fling(_ options: NSDictionary, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) -> Void {
...
Run Code Online (Sandbox Code Playgroud)