【问题标题】:Sending data to server in swift3 and firebase在 swift3 和 firebase 中向服务器发送数据
【发布时间】:2017-03-21 06:29:48
【问题描述】:

我正在尝试更新 firebase 上的节点数据,但是当我发送数组时它崩溃了。它给出了一个错误

无法将 _SwiftValue 类型的对象存储为 0。只能存储 NSNumber、NSString、NSDictionary 和 NSArray 类型的对象。

这是我的代码:

  reference_user.child(user_uid).updateChildValues(["name": username, "phone": phoneNo, "url": imgUrl, "emergency": emerLocalArr], withCompletionBlock: {( error, ref) in

                if (error != nil) {
                    KRProgressHUD.showError(progressHUDStyle: nil, maskType: nil, font: nil, message: "Couldn't Update the node")
                } else {
                 print("success")

                }
            })

emerLocalArrNSMutableArray。 这是我的结构

struct Emergency{
var emer_id: NSNumber
var emer_name: String
var emer_phoneNo: String

init(emergency: NSDictionary) {

    if emergency.object(forKey: "id") != nil {
        emer_id = emergency.object(forKey: "id") as! NSNumber
    }
    else{
        emer_id = 0
    }

    if emergency.object(forKey: "name") != nil {
        emer_name = emergency.object(forKey: "name") as! String
    }
    else{
        emer_name = ""
    }

    if emergency.object(forKey: "phoneNo") != nil{
        emer_phoneNo = emergency.object(forKey: "phoneNo") as! String
    }
    else{
        emer_phoneNo = ""
    }
}

func convertToDictionary() -> [String : Any] {
    let dic: [String: Any] = ["id":self.emer_id, "name":self.emer_name, "phoneNo":self.emer_phoneNo]
    return dic
}
}

【问题讨论】:

  • 你的价值观是什么类型的?该错误表明它们与 Firebase 不兼容
  • emerLocalArr 中的值是模型类 struct Emergency{ var emer_id: NSNumber var emer_name: String var emer_phoneNo: String init(emergency: NSDictionary) { }

标签: ios arrays swift


【解决方案1】:

您的数组包含Emergency 类型的自定义对象,因此首先您需要制作字典数组。因此,在您的结构中添加一个返回字典对象的实例方法,然后使字典数组形成您的自定义对象数组。选中此SO answerstruct 对象数组转换为Dictionary 数组。

然后将该数组设置为您的 Firebase。

let array = emerLocalArr.map { $0.convertToDictionary() }

reference_user.child(user_uid).updateChildValues(["name": username, "phone": phoneNo, "url": imgUrl, "emergency": array], withCompletionBlock: {( error, ref) in

【讨论】:

  • 这一行出现错误 let array = emerLocalArr.map { $0.convertToDictionary() } 类型“NSFastEnumerationIterator.Element”(又名“Any”)的值没有成员“convertToDictionary”。我已经在 struct 类中添加了 convertToDictionary 方法。
  • @RahulGupta 您需要在结构中添加方法convertToDictionary 检查我已链接的答案,并在此函数中根据您的结构属性制作字典。
  • 先生,我也添加了我的结构。
  • @RahulGupta 你已经用[Any] 类型声明了你的数组,所以试试这样。 let array = (emerLocalArr as! [Emergency]).map { $0.convertToDictionary() } 或将 emerLocalArr 的声明更改为 [Emergency] 而不是 [Any]
  • 先生,它有效,但它也更新了节点名称。我在紧急情况下添加了图像,有 2 条记录,分别为 0 和 1,但在更新之前是 1 和 2,所以我该如何阻止呢?
猜你喜欢
  • 2010-12-03
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多