【问题标题】:Swift decode httpsCallable cloud functions responseSwift decode httpsCallable 云函数响应
【发布时间】:2021-06-13 04:27:17
【问题描述】:

我有一个从应用程序调用的 httpsCallable 云函数。从技术上讲,它运行良好,但正如您所见,代码非常嵌套,我觉得这可以更好地处理。我也收到了警告。

响应result?.dataAny 类型,所以我不能直接在try decoder.decode(PaymentIntent.self, from: data) 中使用它,因为这需要Data 类型。为此我使用try? JSONSerialization.data(withJSONObject: result?.data)

知道如何将所有内容解码为PaymentIntent 模型吗?

我有一个从应用程序调用的 httpsCallable 云函数。从技术上讲,它运行良好,但正如您所见,代码非常嵌套,我觉得这可以更好地处理。我也收到了警告。

响应result?.dataAny 类型,所以我不能直接在try decoder.decode(PaymentIntent.self, from: data) 中使用它,因为这需要Data 类型。为此,我使用try? JSONSerialization.data(withJSONObject: result?.data)

知道如何将所有内容解码为PaymentIntent 模型吗?

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase

functions.httpsCallable("createPaymentIntent").call(data) { (result, error) in
    if let error = error as NSError? {
        completion(nil, error)
    } else {
        let data = try? JSONSerialization.data(withJSONObject: result?.data)
        
        if let data = data {
            do {
                let paymentIntent = try decoder.decode(PaymentIntent.self, from: data) // Expression implicitly coerced from 'Any?' to 'Any'
                completion(paymentIntent.clientSecret, nil)
            } catch {
                completion(nil, error);
            }
        }

        // Update

        if let data = result?.data as? NSDictionary {
            print(data)
            
            do {
                // Cannot convert value of type 'NSDictionary' to expected argument type 'Data'
                let paymentIntent = try decoder.decode(PaymentIntent.self, from: data)
                completion(paymentIntent.clientSecret, nil)
            } catch {
                completion(nil, error);
            }
        }
    
    }
}

【问题讨论】:

    标签: ios swift firebase google-cloud-functions swift5


    【解决方案1】:

    用于 Firebase 的可调用函数的 swift SDK 不返回 JSON 字符串。它返回一个已经从 JSON 反序列化的数据类型。它将是字典、数组或直接对应于云函数生成的任何东西。您应该进行一些逐步调试以检查 result.data 实际是什么,然后检查 write some code to verify that it is what you expect,并对其进行强制转换以安全使用它。

    【讨论】:

    • 当我这样做let data = result?.data as? NSDictionary 并打印它时,我得到了正确的响应。所以我假设它是一个字典。问题是当我尝试像这样使用let paymentIntent = try decoder.decode(PaymentIntent.self, from: data) 时出现错误:Cannot convert value of type 'NSDictionary' to expected argument type 'Data' 所以我需要将字典转换为数据吗? (我更新了我的问题)
    • 实际上,这听起来像是一个全新的问题。我建议尊重您的更新,并根据您拥有的新信息单独询问。你必须清楚你的最终目的地是什么,以及你已经尝试过什么。鉴于您知道您手头有一本字典,现在的问题只是关于如何处理该字典。 Firebase 不再真正发挥作用。
    【解决方案2】:

    你现在不能这样做。你总会得到一个字典,你需要使用字典的内容自己实例化对象。

    但是他们正在努力:

    https://github.com/firebase/firebase-ios-sdk/pull/8854

    【讨论】:

      猜你喜欢
      • 2021-10-17
      • 2020-07-17
      • 2018-06-28
      • 2020-02-03
      • 2020-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多