Ios 从Firebase获取数据

Ios 从Firebase获取数据,ios,firebase,Ios,Firebase,我正在尝试从Firebase获取数据,我尝试过这样做: FIREBASE_REF.childByAppendingPath("tasks").observeEventType(.Value, withBlock: { (snapshot) -> Void in print(snapshot.value) self.tasks = [Task]() var task = Task() let da

我正在尝试从Firebase获取数据,我尝试过这样做:

FIREBASE_REF.childByAppendingPath("tasks").observeEventType(.Value, withBlock: { (snapshot) -> Void in
            print(snapshot.value)
            self.tasks = [Task]()
            var task = Task()
            let data = snapshot.value as! NSDictionary
            let tasksFromServer = data.allValues as! [NSDictionary]
            for taskFromServer in tasksFromServer {
                task.description = taskFromServer.objectForKey("description") as! String
                task.startTime = taskFromServer.objectForKey("startTime") as! String
                task.endTime = taskFromServer.objectForKey("endTime") as! String
                task.progress = taskFromServer.objectForKey("progress") as! Int
                let priorityTemp = taskFromServer.objectForKey("priority") as! Int
                switch priorityTemp {
                case 0: task.priority = .Low
                case 1: task.priority = .Medium
                case 2: task.priority = .High
                default: break
                }
                task.assignee = taskFromServer.objectForKey("assignee") as! String
                self.tasks.append(task)
            }
            MBProgressHUD.hideAllHUDsForView(self.view, animated: true)
            self.tableView.reloadData()
        }
但它显示了这一行的错误:

let data = snapshot.value as! NSDictionary
它说:
无法将类型为“\uu NSArrayM”(0x10ebfc8d8)的值强制转换为“NSDictionary”(0x10ebfcd60)。

我从Firebase获得的数据如下:

FIREBASE_REF.childByAppendingPath("tasks").observeEventType(.Value, withBlock: { (snapshot) -> Void in
            print(snapshot.value)
            self.tasks = [Task]()
            var task = Task()
            let data = snapshot.value as! NSDictionary
            let tasksFromServer = data.allValues as! [NSDictionary]
            for taskFromServer in tasksFromServer {
                task.description = taskFromServer.objectForKey("description") as! String
                task.startTime = taskFromServer.objectForKey("startTime") as! String
                task.endTime = taskFromServer.objectForKey("endTime") as! String
                task.progress = taskFromServer.objectForKey("progress") as! Int
                let priorityTemp = taskFromServer.objectForKey("priority") as! Int
                switch priorityTemp {
                case 0: task.priority = .Low
                case 1: task.priority = .Medium
                case 2: task.priority = .High
                default: break
                }
                task.assignee = taskFromServer.objectForKey("assignee") as! String
                self.tasks.append(task)
            }
            MBProgressHUD.hideAllHUDsForView(self.view, animated: true)
            self.tableView.reloadData()
        }

但在另一方面,我在另一个ViewController中使用另一个代码从Firebase获取用户名和角色,这是可行的

FIREBASE_REF.childByAppendingPath("users").observeEventType(.Value, withBlock: { (snapshot) -> Void in
            self.names = []
            self.roles = []
            let data = snapshot.value as! NSDictionary
            let employees = data.allValues as! [NSDictionary]
            for employee in employees {
                let name = (employee.objectForKey("firstName") as! String) + " " + (employee.objectForKey("lastName") as! String)
                self.names.append(name)
                let role = employee.objectForKey("position") as! String
                self.roles.append(role)
            }
            MBProgressHUD.hideAllHUDsForView(self.view, animated: true)
            self.collectionView.reloadData()
        }) 

但是为什么第一个代码总是崩溃


任何帮助都将不胜感激。谢谢。

如果超过50%的键在0和最大键之间(正好是一个零元素),Firebase会将字典对象转换为数组


嗯,似乎
snapshot.value
NSArray
而不是
NSDictionary
(根据您的错误消息),因此
让data=snapshot.value为!NSArray
,并根据此更改修改其他行。请您再次检查我的更新问题,它与其他代码一起工作。我不使用FireBase,也不会说Swift,因此,这只是猜测,但您是否注意到使用
employeemanager
,有
任务
,而a
0
可能会指示它位于索引0处(如数组所示),在您所说的任务之后,您会得到一个带有“assignee”的字典,等等。0表示每个任务的id。如果您查看任务和用户,他们的结构几乎相似,那么为什么一个代码运行良好,而另一个代码导致崩溃。将密钥命名为整数(如数组)通常不是一个好主意-最好让firebase通过childByAutoId创建密钥,然后将任务存储在每个密钥中-非常类似于您的/用户结构。如果需要排序,可以作为子值或时间戳进行排序。