使用 Swift 将数据上传到 Firestore 时出错

Posted

技术标签:

【中文标题】使用 Swift 将数据上传到 Firestore 时出错【英文标题】:Error uploading data to firestore using Swift 【发布时间】:2021-03-24 21:05:30 【问题描述】:

我是 swift 新手,一直在关注一些关于如何将数据上传到 google firestore 的教程,所以我使用此代码上传我的数据:

func firestoreSubmit_data(docRef_string:String, dataToSave:[String: Any], completion: @escaping (Any) -> Void)
let docRef = Firestore.firestore().document(docRef_string)
print("setting data")
docRef.setData(dataToSave) (error) in
    if let error = error 
        print("error = \(error)")
        completion(error)
     else 
        print("data uploaded successfully")
        
    

并使用此代码调用函数:

firestoreSubmit_data(docRef_string: "recipe/\(thisRecipePost.id)", dataToSave: thisRecipePost.dictionary, completion: _ in)

但是当我运行它时,它会产生这个错误:

libc++abi.dylib:以 NSException 类型的未捕获异常终止 *** 由于未捕获的异常“FIRInvalidArgumentException”而终止应用程序,原因:“不支持的类型:__SwiftValue” 以 NSException 类型的未捕获异常终止

see error message here

有没有人知道解决这个问题的方法或解决方法?

编辑:

let thisRecipePost = RecipePost(steps: self.steps,
                                                        ingredients: self.ingredients,
                                                        postingUser: self.env.currentUser.establishedID,
                                                        description: "",
                                                        numberOfLikes: 0,
                                                        image: Image(uiImage: self.images[0].image)

我还为 recipePost 创建了一个结构,如下所示:

struct RecipePost: Identifiable
var id = UUID()
var steps: [Step]
var ingredients: [Ingredient]
var postingUser: String
var description: String
var numberOfLikes: Int
var image: Image

var dictionary: [String: Any] 
    return [
        "id": id.uuidString,
        "steps": steps.formatForFirebase(),
        "ingredients": ingredients.formatForFirebase(),
        "postingUser": postingUser,
        "description": description,
        "numberOfLikes": numberOfLikes
    ]

firebase 函数的格式:

extension Array where Element == Step 
func formatForFirebase() -> [[String:Any]]
    var returnVal:[[String:Any]] = []
    for element in self 
        returnVal.append(element.dictionary)
    
    
    return returnVal

extension Array where Element == Ingredient 
func formatForFirebase() -> [[String:Any]]
    var returnVal:[[String:Any]] = []
    for element in self 
        returnVal.append(element.dictionary)
    
    
    return returnVal

【问题讨论】:

您能否包括您对 thisRecipePost.dictionary 的定义,即正在使用哪些数据类型?看起来您可能传入了一个不受支持的 NSMutableString。 嘿,我刚刚更新了我的帖子以包含“thisRecipePost”,我还添加了我创建的名为 RecipePost 的结构。 感谢您在“thisRecipePost”周围添加额外的上下文。是否也可以添加 steps.formatForFirebase() 和 ingredients.formatForFirebase() 的代码? formatforfirebase 的两种方法都已添加 感谢添加!仔细检查您对步骤和成分的定义,因为您很可能在那里传递了不受支持的数据类型(请参阅下面的我的答案以获取 firestore 文档)。转换为 [String: Any] 并不意味着数据类型一定是有效的。 【参考方案1】:

您遇到的错误表明正在传入不受支持的数据类型。仔细检查您的 dict 中的数据类型(包括 steps.formatForFirebase() 和 ingredients.formatForFirebase())并确保它们是此处列出:firestore supported data types。

【讨论】:

以上是关于使用 Swift 将数据上传到 Firestore 时出错的主要内容,如果未能解决你的问题,请参考以下文章

Swift & Firestore - 使用 .arrayUnion() 将字典附加到嵌套数组

使用 Flutter 将表单上传到 Firestore

将数据从 Firestore 映射到 Swift 中的结构 - IOS

将数组上传到 Firestore

如何将从firebase存储上传的图像保存到firestore数据库中的currentUser

我应该将图片上传到 Cloud Firestore 还是 Firebase Storage?