在firestore中添加新密钥时,应用程序崩溃

问题描述 投票:1回答:1

我使用github跟随谷歌的例子做了一个测试应用程序,但是做了一些更改(在firestore中使用的密钥更少,过滤器更少)。

问题是这样,当我在firestore中添加新密钥时,应用程序崩溃,但应用程序使用之前添加的两个密钥。

fatalError("error")上崩溃并显示错误。我无法理解为什么有两个键应用程序工作,但如果我开始使用第三个键(大厅)然后应用程序崩溃。

可能是什么问题呢?

这是我的代码:

class ViewControllerTwo: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet var tableView: UITableView!

    private var sweets: [Sweet] = []
    private var document: [DocumentSnapshot] = []

    fileprivate var query: Query? {
        didSet {
            if let listener = listener {
                listener.remove()
            }
        }
    }

    private var listener: FIRListenerRegistration?

    fileprivate func observeQuery() {

        guard let query = query else { return }

        stopObserving()

        listener = query.addSnapshotListener { [unowned self] (snapshot, error) in

            guard let snapshot = snapshot else {

                print("Error fetching snapshot results: \(error!)")

                return

            }

            let models = snapshot.documents.map { (document) -> Sweet in

                if let model = Sweet(dictionary: document.data()) {

                    return model

                } else {

                    fatalError("error")

                }

            }

            self.sweets = models

            self.document = snapshot.documents

            self.tableView.reloadData()

        }

    }

    @IBAction func filterButton(_ sender: Any) {
        present(filters.navigationController, animated: true, completion: nil)    
    }

    lazy private var filters: (navigationController: UINavigationController, filtersController: FilterViewController) = {
        return FilterViewController.fromStoryboard(delegate: self)
    }()

    fileprivate func stopObserving() {
        listener?.remove()
    }

    fileprivate func baseQuery() -> Query {
        return Firestore.firestore().collection("sweets").limit(to: 50)    
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        query = baseQuery()    
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)

        observeQuery()
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(true)

        stopObserving()    
    }

    deinit {
        listener?.remove()    
    }

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

        return sweets.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! ViewControllerCell

        let sweet = sweets[indexPath.row]

        cell.studioNameLabel.text = sweet.name
        cell.studioAddressLabel.text = sweet.content
        cell.hallNameLabel.text = sweet.hall

        return cell

    }

}

extension ViewControllerTwo: FiltersViewControllerDelegate {

    func query(withCategory title: String?) -> Query {

        var filtered = baseQuery()

        if let title = title, !title.isEmpty {
            filtered = filtered.whereField("title", isEqualTo: title)
        }

        return filtered
    }

    func controller(_ controller: FilterViewController, didSelectCategory title: String?) {

        let filtered = query(withCategory: title)

        self.query = filtered
        observeQuery()

    }
}

class ViewControllerCell: UITableViewCell {

    @IBOutlet weak var studioNameLabel: UILabel!
    @IBOutlet weak var studioAddressLabel: UILabel!
    @IBOutlet weak var hallNameLabel: UILabel!

}

我的结构:

protocol DocumentSerializable  {
    init?(dictionary:[String:Any])
}
struct Sweet {
    var name:String
    var content:String
    var hall:String
    var dictionary:[String:Any] {
        return [
            "name": name,
            "content" : content,
            "hall" : hall
        ]
    }
}
extension Sweet : DocumentSerializable {

    static let title = [
        "one",
        "two",
        "three",
        "four"
    ]
    init?(dictionary: [String : Any]) {
        guard let name = dictionary["name"] as? String,
            let content = dictionary["content"] as? String,
            let hall = dictionary["hall"] as? String else { return nil }

        self.init(name: name, content: content, hall: hall)
    }
}

我的项目在谷歌驱动器

google drive

google service info.plist

ios swift xcode google-cloud-firestore
1个回答
0
投票

您只需在向现有结构添加任何新密钥后重新安装应用程序。

所以你应该在结构实现之前决定你需要什么键。或者,如果您将来添加新密钥,也可以重新安装应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.