使用 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() 将字典附加到嵌套数组
将数据从 Firestore 映射到 Swift 中的结构 - IOS