static func getKnockKnockJokes(completion: @escaping () -> Void) { let db = Firestore.firestore() let group = DispatchGroup() group.enter() DispatchQueue.global(qos: .background).async { print("countKnockKnockJokes = \(self.countKnockKnockJokes)") if self.countKnockKnockJokes == 0 { while self.countKnockKnockJokes == 0 { if self.countKnockKnockJokes == 0 { self.countKnockKnockJokes = 1 group.leave() }else { print("leaving") group.leave() } } }else { print("skipped") group.leave() } } group.notify(queue: .main) { db.collection("jokes").document("Knock Knock 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.countKnockKnockJokes = JokeNum UserDefaults.standard.setValue(JokeNum, forKey: "countKnockKnockJokes") print("KnockKnockJokeNum = \(self.countKnockKnockJokes)") } var count = 1 print("count = \(count)/\(self.countKnockKnockJokes)") print("countKnockKnockJoke = \(self.countKnockKnockJokes)") //Utilities.knockKnockJokes.removeAll() KnockKnockJokes.knockKnockJokes.removeAll() for _ in 0...self.countKnockKnockJokes { print("count = \(count)/\(self.countKnockKnockJokes)") if let Joke = document!.get("\(count)") as? String { print("KnockKnockJokeNum = \(self.countKnockKnockJokes)") if Utilities.jokes.contains("\(Joke) - From Knock Knock Jokes") {}else { print("Joke = \(Joke)") Utilities.jokes.append("\(Joke) - From Knock Knock Jokes") KnockKnockJokes.knockKnockJokes.append(Joke) print("KnockKnockJokes = \(KnockKnockJokes.knockKnockJokes)") UserDefaults.standard.set(KnockKnockJokes.knockKnockJokes, forKey: defaults.knockKnockJokes.rawValue) Utilities.updateJokesDefaults() } print("countKnockKnockFinal = \(count)/\(self.countKnockKnockJokes)") if count == self.countKnockKnockJokes { completion() } count = count + 1 } } } } } } }