【问题标题】:Firestore query issuesFirestore 查询问题
【发布时间】:2021-10-04 18:39:55
【问题描述】:

我在运行此函数时遇到问题:

    static func getAllJokes(reset: Bool, completion: @escaping () -> Void) {
        Utilities.getDadJokes(reset: reset) {
            print("Dad Jokes Pass, array = \(DadJokes.dadJokes)")
            Utilities.getAssistantJokes(reset: reset) {
                print("Assistant Jokes Pass, array = \(AssistantJokes.assistantJokes)")
                Utilities.getKnockKnockJokes(reset: reset) {
                    print("Knock Knock Jokes Pass, array = \(KnockKnockJokes.knockKnockJokes)")
                    Utilities.getRandomJokes(reset: reset) {
                        print("Random Jokes Pass, array = \(RandomJokes.randomJokes)")
                        completion()
                    }
                }
            }
        }
    }

getDadJokes:

            db.collection("jokes").document("Dad Jokes").addSnapshotListener { document, error in
                //check for error
                if error == nil {
                    //check if document exists
                    if document != nil && document!.exists {
                        if let JokeNum = document!.get("JokeNum") as? Int {
                            self.countDadJokes = JokeNum
                            UserDefaults.standard.setValue(JokeNum, forKey: "countDadJokes")
                            print("DadJokeNum = \(self.countDadJokes)")
                        }
//                        var DadJokes.dadJokes.count = 1
                        print("count = \(DadJokes.dadJokes.count)/\(self.countDadJokes)")
                        print("countDadJoke = \(self.countDadJokes)")
                        self.jokes.removeAll()
                        if reset == true {
                            DadJokes.dadJokes.removeAll()
                        }
//                        for _ in 0...self.countDadJokes {
                        while DadJokes.dadJokes.count <= self.countDadJokes {
//                            print("count = \(DadJokes.dadJokes.count)/\(self.countDadJokes)")
                            if let Joke = document!.get("\(DadJokes.dadJokes.count + 1)") as? String {
                                print("DadJokeNum = \(self.countDadJokes)")
                                if Utilities.jokes.contains("\(Joke) - From Dad Jokes") {}else {
                                    Utilities.jokes.append("\(Joke) - From Dad Jokes")
                                    DadJokes.dadJokes.append(Joke)
                                    UserDefaults.standard.set(DadJokes.dadJokes, forKey: defaults.dadJokes.rawValue)
                                    Utilities.updateJokesDefaults()
                                    print("countDadJokesSaved = \(DadJokes.dadJokes.count)")
                                    print("DadJokesSaved = \(DadJokes.dadJokes)")
                                }
                                print("Dad Joke: \(Joke)")
                                //print("count = \(DadJokes.dadJokes.count)/\(self.countDadJokes)")
                                if DadJokes.dadJokes.count == self.countDadJokes {
                                    completion()
                                }
                            }
                        }
                    }
                }
            }

运行良好,但是当我运行 getAssistantJoke 时(同样的事情):

            print("assistant get running")
            db.collection("jokes").document("Assistant Jokes").addSnapshotListener { document, error in
                //check for error
                if error == nil {
                    //check if document exists
                    if document != nil && document!.exists {
                        if let JokeNum = document!.get("JokeNum") as? Int {
                            self.countAssistantJokes = JokeNum
                            UserDefaults.standard.setValue(JokeNum, forKey: defaults.countAssistantJokes.rawValue)
                            print("DadJokeNum = \(self.countDadJokes)")
                        }
//                        var DadJokes.dadJokes.count = 1
                        print("count = \(AssistantJokes.assistantJokes.count)/\(self.countAssistantJokes)")
                        print("countAssistantJokes = \(self.countAssistantJokes)")
                        if reset == true {
                            AssistantJokes.assistantJokes.removeAll()
                        }
//                        for _ in 0...self.countDadJokes {
                        while AssistantJokes.assistantJokes.count <= self.countAssistantJokes {
//                            print("count = \(AssistantJokes.assistantJokes.count)/\(self.countAssistantJokes)")
                            if let Joke = document!.get("\(DadJokes.dadJokes.count + 1)") as? String {
                                print("AssistantJokeNum = \(self.countAssistantJokes)")
                                if Utilities.jokes.contains("\(Joke) - From Assistant Jokes") {}else {
                                    Utilities.jokes.append("\(Joke) - From Assistant Jokes")
                                    AssistantJokes.assistantJokes.append(Joke)
                                    UserDefaults.standard.set(AssistantJokes.assistantJokes, forKey: defaults.assistantJokes.rawValue)
                                    Utilities.updateJokesDefaults()
                                    print("countAssistantJokesSaved = \(AssistantJokes.assistantJokes.count)")
                                    print("AssistantJokesSaved = \(AssistantJokes.assistantJokes)")
                                }
                                print("Assistant Joke: \(Joke)")
//                                print("count = \(AssistantJokes.assistantJokes.count)/\(self.countAssistantJokes)")
                                if AssistantJokes.assistantJokes.count == self.countAssistantJokes {
                                    completion()
                                }
                            }
                        }
                    }
                }
            }
        }

它在 firebase 查询时停止。文件和一切都存在,因此,有什么问题?一切都存在,我真的很难过。我的目标是检索大量数据并显示一个随机主题。我觉得这应该比现在更容易。

这是我的 Firebase 设置:

【问题讨论】:

  • 没有人知道一个叫 getAssistantJoke 的人是什么。公用事业?它来自哪里?
  • @ElTomato 你是什么意思?
  • 其中一些代码可以进行大量重构。而且...如果您使用快照侦听器,完成块有什么用途吗?
  • 另外......当你说你试图得到所有的笑话时......这是为什么呢?还有……你为什么要把不同类型的笑话分开?拥有一个名为jokes 的集合,然后用type 或其他东西(如果您需要对每种类型做不同的事情)使每个笑话成为该集合中的一个文档,这不是更好吗?
  • 另外,请记住变量应该以小写字母开头。 if let Joke 应该是 if let joke。如果您不遵循这样的约定,就会更难弄清楚发生了什么。

标签: swift firebase google-cloud-firestore


【解决方案1】:

我觉得这里的主要问题是您在 Firestore 中建模数据的方式。

您有一个名为 jokes 的集合,但随后有一个名为 Assistant JokesDad Jokes 等的文档...

我认为更好的结构是让每个文档成为jokes 集合中的一个笑话。为每个笑话使用一个“自动 id”,然后在笑话文档中添加一个类型。

您必须在笑话列表旁边保留JokeNum,这一事实表明存在问题。

通过这种方式,您可以获取所有笑话或按特定类型过滤笑话等...

您的代码目前非常复杂,但我认为最好的方法是以有助于您的代码的方式构建数据。

【讨论】:

  • 我将如何分配类型?你能举个例子吗?另外,在我当前的系统中不能有重复,我可以按照你的建议复制这个吗?
  • 我决定在 Firestore 上通过数组来完成,谢谢。
猜你喜欢
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 2022-01-21
  • 2019-03-05
  • 2021-06-23
  • 2022-01-23
相关资源
最近更新 更多