#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:
Я исправил это, мое удаление всех работало после всех добавлений.