Firebase客户端应用程序

时间:2017-04-20 18:06:22

标签: ios swift uitableview firebase firebase-realtime-database

我正在为我的一个家庭成员制作应用程序,以便他们可以更好地管理他们的客户,但遇到了一些问题。这是我第一次使用Firebase,我似乎无法让我的代码工作!我陷入困境的部分涉及Firebase的实时数据库,我正在使用Swift 3.1在XCode 8.3中工作。

代码:

import UIKit
import FirebaseCore
import FirebaseDatabase
import FirebaseAuth

    var specClientId = ""

    class MyCell: UITableViewCell {

        @IBOutlet var nameCell: UILabel!

        @IBOutlet var statusCell: UILabel!

    }

    class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

        @IBOutlet var tableView: UITableView!

        var ref: FIRDatabaseReference!

        var tableArray: [String] = []

        var clientId: [String] = []

        var statusArray:[String] = []

        @IBAction func signOut(_ sender: Any) {

            UserDefaults.resetStandardUserDefaults()

            performSegue(withIdentifier: "segueBackLogin", sender: self)

        }

        public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

            return tableArray.count

        }

        public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

            let cell = tableView.dequeueReusableCell(withIdentifier: "CellFront") as! MyCell

            cell.nameCell.text = tableArray[indexPath.row]

            cell.statusCell.text = statusArray[indexPath.row]

            return cell

        }

        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

            specClientId = clientId[indexPath.row]

            ref.child("Users").child(specClientId).child("lastUpdate").removeValue()

            performSegue(withIdentifier: "segue", sender: self)

        }

        override func viewDidLoad() {
            super.viewDidLoad()

            if FIRApp.defaultApp() == nil {
                FIRApp.configure()
            }

            ref = FIRDatabase.database().reference()

            ref.child("Users").observeSingleEvent(of: .value, with: { (snapshot) in

                let value = snapshot.value as? NSDictionary

                let specificValues = value?.allKeys

                self.tableArray.removeAll()

                self.statusArray.removeAll()

                self.clientId.removeAll()

                var it = 0

                for Uservalue in specificValues! {

                    self.tableArray.append("")

                    self.statusArray.append("")

                    self.clientId.append(Uservalue as! String)

                    self.ref.child("Users")
                        .child(Uservalue as! String)
                        .child("name")
                        .observeSingleEvent(of: .value, with: { (snapshot) in

                            let nameValue = snapshot.value as? String

                            self.tableArray.insert(nameValue!, at: it)

                            self.tableArray = self.tableArray.filter {$0 != ""}

                            self.tableView.reloadData()

                        }) { (error) in

                            print(error.localizedDescription)

                        }

                    self.ref.child("Users")
                        .child(Uservalue as! String)
                        .child("lastUpdate")
                        .observeSingleEvent(of: .value, with: { (snapshot) in

                            if let nameValue = snapshot.value as? String {

                                self.statusArray.insert("*", at: it)

                                self.tableView.reloadData()

                            } else {

                                self.statusArray.insert("", at: it)

                                self.tableView.reloadData()

                            }

                        }) { (error) in

                            print(error.localizedDescription)

                    }

                    it += 1

                }

            }) { (error) in

                print(error.localizedDescription)

            }

        }

        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }


    }

我的主要问题是,当我获得用户名和lastUpdate状态时,数组列表无法正确匹配,并且TableView根据哪个用户提交了更新显示错误信息。为了解决这个问题,我尝试在我的数组中使用insert方法,但现在应用程序崩溃了。以前,我使用的是append方法,但这会导致在TableView中显示错误的信息。如果你们中的任何一个人能帮我解决这个问题,我将不胜感激。

注意:由于StatusArray没有与TableArray相同数量的元素,应用程序崩溃。这是由TableArray包含一些没有名称的空元素引起的。

谢谢, KPS

编辑1:

for Uservalue in specificValues! {

                self.clientId.append(Uservalue as! String)

                let user = User()

                self.ref.child("Users")
                    .child(Uservalue as! String)
                    .observeSingleEvent(of: .value, with: { (snapshot) in

                        let nameValue = snapshot.value as? NSDictionary

                        let specNameValue = nameValue?.allKeys

                        var i = 0

                        while i < specNameValue!.count {

                            if specNameValue?[i] as? String == "name" {

                                user.name = nameValue?.allValues[i] as! String

                            } else if specNameValue?[i] as? String == "lastUpdate" {

                                user.status = "*"

                            } else if specNameValue?[i] as? String != "name" && specNameValue?[i] as? String != "lastUpdate" && specNameValue?[i] as? String != "message" && specNameValue?[i] as? String != "adminMessage" && specNameValue?[i] as? String != "photoURL" {

                                user.status = ""

                            }

                            i += 1

                        }


                    }) { (error) in

                        print(error.localizedDescription)

                    }

                self.tableArray.append(user)

                self.tableView.reloadData()

            }

1 个答案:

答案 0 :(得分:0)

您的应用崩溃的主要原因是因为在您的单元格中,您在加载第一个用户后重新加载,并且单元格期望statusArray已经包含元素。

cell.nameCell.text = tableArray[indexPath.row]
cell.statusCell.text = statusArray[indexPath.row] // fails here I assume

我将尝试解决一些问题。

  • 您正在为每个迭代的子项立即重新加载表。将元素附加到每个数组然后通过调用tableView.reloadData()
  • 完成显示所有元素将是明智的
  • 状态是否与您期望的名称无关?如果数据是相关的,那么创建一个简单的Object来存放这些数据并拥有tableView将用于它的dataSource的单个数据数组将是明智的
  • 数据完全加载后,您可以相应地对数据进行排序,然后重新加载数据源,以解决从服务器中丢失数据的问题。这就是append(element: )简单实用的原因

希望这有帮助!这看起来似乎有点多,但对于你自己的表现,组织和可读性肯定是有益的。