Почему этот массив очищается

#arrays #swift #uikit

Вопрос:

У меня проблема, когда я вызываю функцию, она добавляет массив, а затем я получаю из него случайный элемент, проблема в том, что он продолжает стираться сразу после вызова функции, прежде чем я смогу ее использовать, поэтому запрос на случайный элемент вызывает фатальную ошибку.

 Utilities.getKnockKnockJokes {

            self.previousKnockKnockJoke = self.currentKnockKnockJoke

            print("currentKnockKnockJoke = (self.currentKnockKnockJoke)")

            self.currentKnockKnockJoke = KnockKnockJokes.knockKnockJokes.randomElement()!

            print("newCurrentKnockKnockJoke = (self.currentKnockKnockJoke)")

            self.singleServeText.text = self.currentKnockKnockJoke

        }
 

Вызываемая функция находится ниже:

 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 amp;amp; 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
                            }
                        }
                    }
                }
            }
        }
    }
 

Комментарии:

1. является ли ваш оператор IF, который содержит KnockKnockJokes.knockKnockJokes.append(Joke) фактическое выполнение? Попробуйте установить там точку останова и проверьте ее. Также попробуйте завернуть KnockKnockJokes.knockKnockJokes.append(Joke) . таким DispatchQueue.main.async {} образом, вы будете уверены, что добавление массива происходит в основном потоке, а не в фоновом потоке.

2. Пожалуйста, обратите внимание, что с помощью печати я определил, что он добавляется, а затем очищается.

Ответ №1:

попробуйте это:

 if count == self.countKnockKnockJokes {
    completion()
    return   // <--- here
}
 

Комментарии:

1. К сожалению, это не сработало. Есть еще какие-нибудь идеи? Я также могу связать весь проект, если нужно, чтобы попробовать его самостоятельно.

Ответ №2:

Я исправил это, мое удаление всех работало после всех добавлений.