enum JokeError: Error { case noDocument case noJoke } func setRandomJoke(completion: @escaping (Error?)->Void) { var countDadJokes = Int() var countAssistantJokes = Int() var countKnockKnockJokes = Int() var countRandomJokes = Int() func getDadJokes(completion: @escaping (Error?)->Void) { let collectionRef = self.db.collection("jokes") let documentRef = collectionRef.document("Dad Jokes") documentRef.getDocument(completion: { documentSnapshot, error in if let error = error { print(error) //# Use `print(error)` rather than `print(error.localizedDescription)` completion(error) return } countDadJokes = (documentSnapshot?.data()!.count)! + 1 //print("count = \(count)") //# Do the next thing inside the completion handler self.db.collection("jokes").document("Dad Jokes").addSnapshotListener { document, error in //check for error if let error = error { print(error) completion(error) return } //check if document exists if let doc = document, doc.exists { if let joke = doc.get("\(Int.random(in: 0...countDadJokes))") as? String { self.DadJokes = joke print("Joke: \(self.DadJokes)") //# Do the next thing inside the completion handler completion(nil) return } else { completion(JokeError.noJoke) return } } else { completion(JokeError.noDocument) return } } }) } func getAssistantJokes(completion: @escaping (Error?)->Void) { if countAssistantJokes == 0 { let collectionRef = self.db.collection("jokes") let documentRef = collectionRef.document("Assistant Jokes") documentRef.getDocument(completion: { documentSnapshot, error in if let error = error { print(error) completion(error) return } countAssistantJokes = (documentSnapshot?.data()!.count)! + 1 //print("count = \(count)") self.db.collection("jokes").document("Assistant Jokes").addSnapshotListener { document, error in if let error = error { print(error) completion(error) return } //check if document exists if let doc = document, doc.exists { if let joke = document!.get("\(Int.random(in: 0...countAssistantJokes))") as? String { self.AssistantJokes = joke print("Joke: \(self.AssistantJokes)") completion(nil) return } else { completion(JokeError.noJoke) return } } else { completion(JokeError.noDocument) return } } }) } else { completion(nil) return } } func getKnockKnockJokes(completion: @escaping (Error?)->Void) { if countDadJokes == 0 { let collectionRef = self.db.collection("jokes") let documentRef = collectionRef.document("Knock Knock Jokes") documentRef.getDocument(completion: { documentSnapshot, error in if let error = error { print(error) completion(error) return } countKnockKnockJokes = (documentSnapshot?.data()!.count)! + 1 //print("count = \(count)") self.db.collection("jokes").document("Knock Knock Jokes").addSnapshotListener { document, error in //check for error if let error = error { print(error) completion(error) return } //check if document exists if let doc = document, doc.exists { if let joke = doc.get("\(Int.random(in: 0...countKnockKnockJokes))") as? String { self.KnockKnockJokes = joke print("Joke: \(self.KnockKnockJokes)") completion(nil) return } else { completion(JokeError.noJoke) return } } else { completion(JokeError.noDocument) return } } }) } else { completion(nil) return } } func getRandomJokes(completion: @escaping (Error?)->Void) { if countDadJokes == 0 { let collectionRef = self.db.collection("jokes") let documentRef = collectionRef.document("Random Jokes") documentRef.getDocument(completion: { documentSnapshot, error in if let error = error { print(error) completion(error) return } countRandomJokes = (documentSnapshot?.data()!.count)! + 1 //print("count = \(count)") self.db.collection("jokes").document("Dad Jokes").addSnapshotListener { document, error in //check for error if let error = error { print(error) completion(error) return } //check if document exists if let doc = document, doc.exists { if let joke = doc.get("\(Int.random(in: 0...countRandomJokes))") as? String { self.RandomJokes = joke print("Joke: \(self.RandomJokes)") } else { completion(JokeError.noJoke) return } } else { completion(JokeError.noDocument) return } } }) } else { completion(nil) return } } let pickedCat = Int.random(in: 1...4) //print("picked cat: \(pickedCat)") if pickedCat == 1 { getRandomJokes { error in if let error = error { print(error) completion(error) return } self.randomJoke.text = "Random Joke: \(self.DadJokes)" //print("Random Joke: \(self.DadJokes)") finishRandomJoke() completion(nil) return } } else if pickedCat == 2 { getAssistantJokes { error in if let error = error { print(error) completion(error) return } self.randomJoke.text = "Random Joke: \(self.AssistantJokes)" //print("Random Joke: \(self.AssistantJokes)") finishRandomJoke() completion(nil) return } } else if pickedCat == 3 { getKnockKnockJokes { error in if let error = error { print(error) completion(error) return } self.randomJoke.text = "Random Joke: \(self.KnockKnockJokes)" //print("Random Joke: \(self.KnockKnockJokes)") finishRandomJoke() completion(nil) return } } else if pickedCat == 4 { getRandomJokes { error in if let error = error { print(error) completion(error) return } self.randomJoke.text = "Random Joke: \(self.RandomJokes)" //print("Random Joke: \(self.RandomJokes)") finishRandomJoke() completion(nil) return } } func finishRandomJoke() { if randomJoke.text == "Random Joke: " { randomJoke.text = "Random Joke: Failed to connect to server" } } }