【问题标题】:Array of Dictionary Objects changes after sending to firebase cloud function in Swift?在 Swift 中发送到 firebase 云函数后,字典对象数组会发生变化吗?
【发布时间】:2018-05-27 21:00:38
【问题描述】:

我有一个名为 assets 的字典对象数组,当用 Swift 打印出来时,它显示:

[
    ["assetType": "video", "assetPath": "some_path"],
    ["assetType": "image", "assetPath": "some_other_path"]
]

这是完美的,但是,在我将其发送到我的 firebase 云功能并在云功能中打印出来后,assets 变为:

[
    {
        "assetType": ["video", "image"],
        "assetPath": ["some_path", "some_other_path"]
    }
]

为什么会这样?我该如何解决这个问题?

------------------更新------------- -----------------

我使用Alamofire模块来执行http请求:

Alamofire.request(
    "https://....",
    method: .post,
    parameters: [
        "assets": assets
    ]
)

------------------更新 2------------ ------------------

我的云功能如下:

exports.testFunction = functions.https.onRequest((req, res) => {
    const { assets } = req.body;
    return res.status(200).send(assets)
})

一被调用就立即发回assets

【问题讨论】:

  • 有人投票结束了这个问题,因为它离题了,因为它在问“为什么这段代码不起作用?”,首先,我不是在问这个问题,我个人认为我的代码应该是在职的。其次,如果我不能在这里问,你认为我应该去哪里问这个问题?
  • 可能跟云功能有关。不是你的快速代码。
  • @S1LENTWARRIOR,谢谢你的回复,我的firebase云功能立即发回assets,没有做任何事情。但不知何故,这发生了。我已经更新了这个问题

标签: ios swift firebase google-cloud-functions


【解决方案1】:

更新:Alamofire 的做法在底部

我尝试了其他方法,只能回答问题的第二部分:我该如何解决这个问题?。显然,不使用Alamofire 可以解决问题,但我确信Alamofire 没有任何问题,可能缺少一些东西,我会进一步挖掘,但现在,Alamofire 的替代品是URLSession :

let session = URLSession.shared
let url: URL = URL(string: "https://...")!
let request = NSMutableURLRequest(url: URL)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")

do {
    request.httpBody = try JSONSerialization.data(
        withJSONObject: [
            "assets": assets
        ],
        options: JSONSerialization.WritingOptions()
    )
    let task = session.dataTask(with: request as URLRequest) { (data, _, _) in
        if let responseData = data {
            print(String(data: responseData, encoding: .utf8)!)
        }
    }
    task.resume()
} catch {
    print(error)
}

然后打印出来:

[
    {
        "assetType": "video",
        "assetPath": "some_path"
    },
    {
        "assetType": "image",
        "assetPath": "some_other_path"
    }
]

--------------Alamofire 方式-------------- ------------

阅读文档here,显然,我也应该添加encoding 选项:

Alamofire.request(
    "https://...",
    method: .post,
    parameters: [
        "assets": assets
    ],
    encoding: JSONSerialization(options: [])
)

而这个问题就迎刃而解了。

【讨论】:

  • 很高兴您自己找到了解决方案并发布了它。现在我鼓励你也接受你的回答。
  • @S1LENTWARRIOR,谢谢。是的,如果允许,我会在 24 小时内接受。
猜你喜欢
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多