Arrays 自定义类的字典数组

Arrays 自定义类的字典数组,arrays,dictionary,firebase,swift3,completionhandler,Arrays,Dictionary,Firebase,Swift3,Completionhandler,我已经成功地将我的Firebase数据拉入字典,但是我很难将这些值放入我的自定义类中 要从Firebase获取数据,我使用以下代码: func testing(completion: @escaping ([String : Any]) -> ()) { ref.child("dailyJobs").observe(.childAdded, with: { (snapshot) in if let value = snapshot.value as? [Strin

我已经成功地将我的Firebase数据拉入字典,但是我很难将这些值放入我的自定义类中

要从Firebase获取数据,我使用以下代码:

func testing(completion: @escaping ([String : Any]) -> ()) {

    ref.child("dailyJobs").observe(.childAdded, with: { (snapshot) in
        if let value = snapshot.value as? [String : Any] {
            completion(value as [String : Any])
            return
        }
        completion([:])
    })
}
当我调用函数时

testing { (dictionary) in
        print(dictionary)
    }
我从Firebase得到的字典如下(它是一组字典):

我的自定义类是:

class JobsAndHabits {

var name: String
var multiplier: Double
var assigned: String
var order: Int

init(jobName: String, jobMultiplier: Double, jobAssign: String, jobOrder: Int) {

    self.name = jobName
    self.multiplier = jobMultiplier
    self.assigned = jobAssign
    self.order = jobOrder
}
我解析
词典的代码如下:

testing { (dictionary) in
        for item in dictionary {
            print(item)
            let multiplier = dictionary["multiplier"] as! Double
            let name = dictionary["name"] as! String
            let assigned = dictionary["assigned"] as! String
            let order = dictionary["order"] as! Int

            let dailyJob = JobsAndHabits(jobName: name, jobMultiplier: multiplier, jobAssign: assigned, jobOrder: order)
            self.dailyJobs.append(dailyJob)
        }
        print(self.dailyJobs)
我得到的是:

[ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits, ToDo_App.JobsAndHabits]
每本字典有4本。不知何故,我的代码将数组复制了4倍,现在我的头很痛。我相信有一个简单的解决办法

我也尝试过:

将所有代码放入原始闭包中,如下所示:

    func loadExistingJobs(_ completion: @escaping () -> ()) {
    ref.child("dailyJobs").observe(.childAdded, with: { (snapshot) in
        if let dictionary = snapshot.value as? [String : Any] {
            let multiplier = dictionary["multiplier"] as! Double
            let name = dictionary["name"] as! String
            let assigned = dictionary["assigned"] as! String
            let order = dictionary["order"] as! Int

            let dailyJob = JobsAndHabits(jobName: name, jobMultiplier: multiplier, jobAssign: assigned, jobOrder: order)
            self.dailyJobs.append(dailyJob)
            self.dailyJobs.sort(by: {$0.order < $1.order})

            self.jobsTableView.reloadData()
            completion()
        }
    })
func加载现有作业(u完成:@escaping()->()){
ref.child(“dailyJobs”).observe(.childAdded,在
如果let dictionary=snapshot.value as?[字符串:Any]{
让乘数=字典[“乘数”]为!双精度
让name=dictionary[“name”]作为!字符串
设assigned=dictionary[“assigned”]为!字符串
让order=dictionary[“order”]as!Int
让dailyJob=JobsAndHabits(jobName:name,Job乘数:乘数,jobAssign:assigned,jobOrder:order)
self.dailyJobs.append(dailyJob)
self.dailyJobs.sort(按:{$0.order<$1.order})
self.jobsTableView.reloadData()
完成()
}
})
但是
@escaping
闭包没有正常运行,我的后续代码也没有执行

TL;DR-我想从Firebase中提取数据并将其附加到我的阵列中。

请检查:

你的
字典是
[“name”:自定义杂务列表,“multiplier”:1,“assigned”:none,“order”:0]
,你正在为此编写循环。它有4个键,因此循环4次

如果您的字典类似于[String:Any],那么您必须调用如下代码:

testing { (dictionary) in
    let multiplier = Double(dictionary["multiplier"] as! Int)
    let name = dictionary["name"] as! String
    let assigned = dictionary["assigned"] as! String
    let order = dictionary["order"] as! Int

    let dailyJob = JobsAndHabits(jobName: name, jobMultiplier: multiplier, jobAssign: assigned, jobOrder: order)
    self.dailyJobs.append(dailyJob)

    print(self.dailyJobs)
})
func testing(completion: @escaping ([[String : Any]]) -> ()) {
    let dictionary = [[String: Any]]
    ref.child("dailyJobs").observe(.childAdded, with: { (snapshot) in
        for child in (snapshot?.children)! {
            let snap = child as! FDataSnapshot //each child is a snapshot
            if let value = snap.value as? [String : Any] {
                dictionary.append(value)   
            }
        }
        completion(dictionary)
    })
}

testing { (dictionary) in
    for item in dictionary {
        print(item)
        let multiplier = Double(item["multiplier"] as! Int)
        let name = item["name"] as! String
        let assigned = item["assigned"] as! String
        let order = item["order"] as! Int
        let dailyJob = JobsAndHabits(jobName: name, jobMultiplier: multiplier, jobAssign: assigned, jobOrder: order)
        self.dailyJobs.append(dailyJob)
        //            }
        print(self.dailyJobs)
    }
})
如果您的字典类似于[[String:Any]],那么您必须按如下方式调用:

testing { (dictionary) in
    let multiplier = Double(dictionary["multiplier"] as! Int)
    let name = dictionary["name"] as! String
    let assigned = dictionary["assigned"] as! String
    let order = dictionary["order"] as! Int

    let dailyJob = JobsAndHabits(jobName: name, jobMultiplier: multiplier, jobAssign: assigned, jobOrder: order)
    self.dailyJobs.append(dailyJob)

    print(self.dailyJobs)
})
func testing(completion: @escaping ([[String : Any]]) -> ()) {
    let dictionary = [[String: Any]]
    ref.child("dailyJobs").observe(.childAdded, with: { (snapshot) in
        for child in (snapshot?.children)! {
            let snap = child as! FDataSnapshot //each child is a snapshot
            if let value = snap.value as? [String : Any] {
                dictionary.append(value)   
            }
        }
        completion(dictionary)
    })
}

testing { (dictionary) in
    for item in dictionary {
        print(item)
        let multiplier = Double(item["multiplier"] as! Int)
        let name = item["name"] as! String
        let assigned = item["assigned"] as! String
        let order = item["order"] as! Int
        let dailyJob = JobsAndHabits(jobName: name, jobMultiplier: multiplier, jobAssign: assigned, jobOrder: order)
        self.dailyJobs.append(dailyJob)
        //            }
        print(self.dailyJobs)
    }
})
请检查:

你的
字典是
[“name”:自定义杂务列表,“multiplier”:1,“assigned”:none,“order”:0]
,你正在为此编写循环。它有4个键,因此循环4次

如果您的字典类似于[String:Any],那么您必须调用如下代码:

testing { (dictionary) in
    let multiplier = Double(dictionary["multiplier"] as! Int)
    let name = dictionary["name"] as! String
    let assigned = dictionary["assigned"] as! String
    let order = dictionary["order"] as! Int

    let dailyJob = JobsAndHabits(jobName: name, jobMultiplier: multiplier, jobAssign: assigned, jobOrder: order)
    self.dailyJobs.append(dailyJob)

    print(self.dailyJobs)
})
func testing(completion: @escaping ([[String : Any]]) -> ()) {
    let dictionary = [[String: Any]]
    ref.child("dailyJobs").observe(.childAdded, with: { (snapshot) in
        for child in (snapshot?.children)! {
            let snap = child as! FDataSnapshot //each child is a snapshot
            if let value = snap.value as? [String : Any] {
                dictionary.append(value)   
            }
        }
        completion(dictionary)
    })
}

testing { (dictionary) in
    for item in dictionary {
        print(item)
        let multiplier = Double(item["multiplier"] as! Int)
        let name = item["name"] as! String
        let assigned = item["assigned"] as! String
        let order = item["order"] as! Int
        let dailyJob = JobsAndHabits(jobName: name, jobMultiplier: multiplier, jobAssign: assigned, jobOrder: order)
        self.dailyJobs.append(dailyJob)
        //            }
        print(self.dailyJobs)
    }
})
如果您的字典类似于[[String:Any]],那么您必须按如下方式调用:

testing { (dictionary) in
    let multiplier = Double(dictionary["multiplier"] as! Int)
    let name = dictionary["name"] as! String
    let assigned = dictionary["assigned"] as! String
    let order = dictionary["order"] as! Int

    let dailyJob = JobsAndHabits(jobName: name, jobMultiplier: multiplier, jobAssign: assigned, jobOrder: order)
    self.dailyJobs.append(dailyJob)

    print(self.dailyJobs)
})
func testing(completion: @escaping ([[String : Any]]) -> ()) {
    let dictionary = [[String: Any]]
    ref.child("dailyJobs").observe(.childAdded, with: { (snapshot) in
        for child in (snapshot?.children)! {
            let snap = child as! FDataSnapshot //each child is a snapshot
            if let value = snap.value as? [String : Any] {
                dictionary.append(value)   
            }
        }
        completion(dictionary)
    })
}

testing { (dictionary) in
    for item in dictionary {
        print(item)
        let multiplier = Double(item["multiplier"] as! Int)
        let name = item["name"] as! String
        let assigned = item["assigned"] as! String
        let order = item["order"] as! Int
        let dailyJob = JobsAndHabits(jobName: name, jobMultiplier: multiplier, jobAssign: assigned, jobOrder: order)
        self.dailyJobs.append(dailyJob)
        //            }
        print(self.dailyJobs)
    }
})

嘿,你可以试试这个代码,并根据需要修改

class JobsAndHabits {

    var name: String
    var multiplier: Double
    var assigned: String
    var order: Int

    init(jobName: String, jobMultiplier: Double, jobAssign: String, jobOrder: Int) {

        self.name = jobName
        self.multiplier = jobMultiplier
        self.assigned = jobAssign
        self.order = jobOrder
    }
    class func getAllJobsAndHabbits(forUserID userID: String, completion: @escaping (JobsAndHabits) -> Swift.Void, failure: @escaping () -> ()) {
        if Auth.auth().currentUser != nil {
            Database.database().reference().child("jobsAndHabits").child(userID).observe(.childAdded, with: { (snapshot) in
                if snapshot.exists() {
                    let receivedMessage = snapshot.value as! [String: Any]

                    let name = receivedMessage["content"] as? String ?? ""
                    let multiplier = receivedMessage["multiplier"] as? Double ?? 0.0
                    let assigned = receivedMessage["assigned"] as? String ?? ""
                    let order = receivedMessage["order"] as? Int ?? 0
                    completion(JobsAndHabits(jobName: name, jobMultiplier: multiplier, jobAssign: assigned, jobOrder: order))
                } else {
                    failure()
                }
            })
        } else {
            failure()
        }
    }
}
呼叫和处理的方式

class Test {
   let dailyJobs:[JobsAndHabits] = []

   JobsAndHabits.getAllJobsAndHabbits(forUserID: "12346", completion: {
       self.dailyJobs.append(dailyJob)
       self.dailyJobs.sort(by: {$0.order < $1.order})
    }) {
        //handle error
    }
}
类测试{
让dailyJobs:[工作和习惯]=[]
JobsandHabbits.getAllJobsAndHabbits(用于用户ID:“12346”,完成:{
self.dailyJobs.append(dailyJob)
self.dailyJobs.sort(按:{$0.order<$1.order})
}) {
//处理错误
}
}

嘿,您可以尝试此代码,并根据需要进行修改

class JobsAndHabits {

    var name: String
    var multiplier: Double
    var assigned: String
    var order: Int

    init(jobName: String, jobMultiplier: Double, jobAssign: String, jobOrder: Int) {

        self.name = jobName
        self.multiplier = jobMultiplier
        self.assigned = jobAssign
        self.order = jobOrder
    }
    class func getAllJobsAndHabbits(forUserID userID: String, completion: @escaping (JobsAndHabits) -> Swift.Void, failure: @escaping () -> ()) {
        if Auth.auth().currentUser != nil {
            Database.database().reference().child("jobsAndHabits").child(userID).observe(.childAdded, with: { (snapshot) in
                if snapshot.exists() {
                    let receivedMessage = snapshot.value as! [String: Any]

                    let name = receivedMessage["content"] as? String ?? ""
                    let multiplier = receivedMessage["multiplier"] as? Double ?? 0.0
                    let assigned = receivedMessage["assigned"] as? String ?? ""
                    let order = receivedMessage["order"] as? Int ?? 0
                    completion(JobsAndHabits(jobName: name, jobMultiplier: multiplier, jobAssign: assigned, jobOrder: order))
                } else {
                    failure()
                }
            })
        } else {
            failure()
        }
    }
}
呼叫和处理的方式

class Test {
   let dailyJobs:[JobsAndHabits] = []

   JobsAndHabits.getAllJobsAndHabbits(forUserID: "12346", completion: {
       self.dailyJobs.append(dailyJob)
       self.dailyJobs.sort(by: {$0.order < $1.order})
    }) {
        //handle error
    }
}
类测试{
让dailyJobs:[工作和习惯]=[]
JobsandHabbits.getAllJobsAndHabbits(用于用户ID:“12346”,完成:{
self.dailyJobs.append(dailyJob)
self.dailyJobs.sort(按:{$0.order<$1.order})
}) {
//处理错误
}
}

是的,那么我该如何避免呢?我被难住了。我该如何将这四个键放入我的一类对象中?请检查我的代码。删除循环。现在您将得到正确的结果。崩溃。
在第1行展开可选值时意外地发现了零:
让乘数=字典…
否。您正在尝试将任何值转换为零uble。所以它失败了。你的
乘数是双倍的,它在字典中的值是Int。好的。修复了。但是现在数据仍然在填充,即使我调用了代码。当我打印到控制台
dailyJobs.count
,我得到
1,2,3,4,5,6,7,8,9,10
。这意味着代码仍然在运行。它应该是
10
。我的完成处理程序错了吗?是的,那么我该如何避免?我很困惑。我该如何将这四个键放入我的一个类对象中?请检查我的代码。为循环删除。现在你将得到正确的结果。崩溃。
在第1行展开可选值时意外地发现了nil:
让乘数=字典…
不。您正在尝试将任何值转换为双精度。因此,它失败了。您的
乘法器是双精度的,并且它在字典中的值是Int。好的。得到了修复。但现在,即使在我调用代码之后,数据仍然填充。当我打印到控制台
日常作业。计数
时,我得到
1、2、3、4、5、6、7、8、9、10
。这意味着代码仍在运行。它应该是
10
。我的完成处理程序是否错误?Hmmm..
dailyJobs
仍在异步加载。我希望在来自数据库的最后一次调用上运行代码,而不是以增量方式运行代码。您知道,我希望根据
dailyJobs
列表追加另一个数组。Hmmm..
dailyJobs
仍在运行异步加载。我希望对来自数据库的最后一个调用运行代码,而不是以增量方式运行。您知道,我希望根据
dailyJobs
列表附加另一个数组。