【问题标题】:Upload array of Objects Firestore swift上传 Objects Firestore swift 数组
【发布时间】:2021-05-30 16:22:05
【问题描述】:

使用 swift 和 firestore 并尝试实现类似这样的服务器:

    chatId: String
    eventCreatorId: String
    matchedUserId: String
    eventId: String
    messages: [
    {userId: String, timestamp:timestamp, messageText: String},
    {userId: String, timestamp:timestamp, messageText: String},
  ],

换句话说,对于 MVVM 设计,我想上传一组模型 但是当我尝试这个时出现类型错误

struct ChatModel: Codable {
    var chatId: String
    var eventCreatorId: String
    var matchedUserId: String
    var eventId: String
    var messages: [MessageModel]

}

struct MessageModel: Codable {
    var userId: String
    var timeStamp: Timestamp
    var messageText: String
    
}

如果我尝试上传会发生错误

    func uploadMessage(messageText: String, chatId: String) -> Promise<Void> {
        return Promise { seal in
            guard let currentUser = Auth.auth().currentUser else {
                return
            }
            let timeStamp: Timestamp = Timestamp(date: Date())
            let messageModel = MessageModel(userId: currentUser.uid,timestamp: timeStamp, messageText: messageText)
            print(messageModel)
                let _ = db.collection("chats")
                    .document(chatId)
                    .updateData(["messages" : FieldValue.arrayUnion([messageModel])]) { error in
                        if let error = error {
                            seal.reject(error)
                        } else {
                            seal.fulfill(())
                        }
                    }
            }
        }
        
    }

我也试过没有时间戳,但遇到了同样的错误

谁能解释一下我做错了什么?

【问题讨论】:

  • 您看到了什么错误?调用后是 Swift 语法错误还是 Firebase 错误?
  • *** 由于未捕获的异常“FIRInvalidArgumentException”而终止应用程序,原因:“不支持的类型:__SwiftValue”以未捕获的 NSException 类型异常终止
  • 我认为这是 firebase 错误,firebase 不知道类型
  • 这是在哪里发生的?您没有显示实际上会导致该错误的代码
  • 对不起,我认为我的错误是在模型结构中,我在我的问题中添加了上传功能

标签: arrays swift firebase google-cloud-firestore upload


【解决方案1】:

在 ArrayUnion 上,Firestore 不了解您尝试传递的类型。 将结构转换为类型为 [String: Any] 的字典将忽略此错误 -

struct MessageModel: Codable {
    var userId: String
    var timeStamp: Timestamp
    var messageText: String
    
    var dictionary: [String: Any] {
        return["userId": userId,
               "timeStamp": timeStamp,
               "messageText": messageText]
    }
}

然后,当您上传到 Firestore 时,您使用 Dict 值:

 .updateData(["messages" : FieldValue.arrayUnion([messageModel.dictionary])]) { error in

【讨论】:

    猜你喜欢
    • 2021-12-04
    • 2020-11-08
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    相关资源
    最近更新 更多