Я пытаюсь сравнить свои ответы с ответами других людей в базе данных firebase. Мой сценарий в настоящее время имеет 2 оператора if, говорящих, если это мой ответ, запишите мои ответы, а затем используйте это для сравнения с другими ответами, но он не регистрирует мой второй оператор if.
let responsesReference = Database.database().reference().child("responses")
responsesReference.observeSingleEvent(of: .value) { (snapshot: DataSnapshot) in
guard let json = snapshot.value as? [String: Any] else { return }
do {
var similarities = [Similarity]()
for answerElement in json {
if self.currentUser.uid == answerElement.key,
let myanswer = answerElement.value as? [String: Any] {
if self.currentUser.uid != answerElement.key, //DOES NOT REGISTER
let otheranswer = answerElement.value as? [String: Any] {
let percentage = myanswer.similarity(with: otheranswer)
similarities.append(
Similarity(name: answerElement.key, percentage: percentage, answer: otheranswer)
)
}
}
}
self.similarities = similarities.sorted(by: { (a, b) -> Bool in
return a.percentage > b.percentage
})
self.tableView.reloadData()
}
да, сначала если оператор был выполнен. Я думаю, проблема в том, что когда первое утверждение if было истинным, второе больше не верно, поэтому оно не выполняется? Не уверен, что есть лучший способ написать этот скрипт.
Вот ваш код в правильном формате (я скопировал и вставил его без изменений, кроме форматирования)
do {
var similarities = [Similarity]()
for answerElement in json {
if self.currentUser.uid == answerElement.key, let myanswer = answerElement.value as? [String: Any] {
if self.currentUser.uid != answerElement.key, let otheranswer = answerElement.value as? [String: Any] {
let percentage = myanswer.similarity(with: otheranswer)
similarities.append( Similarity(name: answerElement.key, percentage: percentage, answer: otheranswer) )
}
}
Взгляните сюда
if self.currentUser.uid == answerElement.key
и обратите внимание на следующий, если он вложен внутри этого
if self.currentUser.uid == answerElement.key
if self.currentUser.uid != answerElement.key
Если эти две переменные равны снаружи if, они будут равны и внутри if, поэтому вторая проверка всегда будет терпеть неудачу.
Общее решение состоит в том, чтобы использовать and else с вашим if
if self.currentUser.uid == answerElement.key {
let myanswer = answerElement.value as? [String: Any] <- OPTIONAL!
//do something because they are equal
} else {
let otheranswer = answerElement.value as? [String: Any] <- OPTIONAL!
// do something else because they are NOT equal
}
также обратите внимание, что у вас есть некоторые опции в этом коде, и если они обнулятся, ваше приложение либо выйдет из строя, либо молча выйдет из строя без указания причины.
Логика не совсем ясна в этом коде
let percentage = myanswer.similarity(with: otheranswer)
как каждый раз через цикл
for answerElement in json {
}
в answerElement будет только один ответ. например не будет моего Ответа и другого Ответа, будет только Ответ. Возможно, должно быть сравнение с предыдущим ответом из цикла; Я расскажу об этом
Вот пример, основанный на чтении всех пользователей, получении ответа для этого пользователя, удалении пользователя из результатов и последующем сравнении этого с ответами других пользователей. Предположим, что пользовательские uid используются в качестве ключа для каждого пользовательского узла (который также содержит ответ, который они предоставляют), и мы знаем uid пользователей, прошедших аутентификацию.
let thisUsersUid = "uid_1"
let usersRef = self.ref.child("users") //self.ref points to MY firebase
usersRef.observeSingleEvent(of: .value, with: { snapshot in
var allUsersSnap = snapshot.children.allObjects as! [DataSnapshot]
guard let index = allUsersSnap.firstIndex { $0.key == thisUsersUid } else {
print("no user: \(thisUsersUid) found")
return
}
let thisUserSnap = allUsersSnap[index] //keep this so it can be compared later
allUsersSnap.remove(at: index)
let thisUsersAnswer = thisUserSnap.childSnapshot("answer").value as? String ?? "No Answer"
for otherUserSnap in allUsersSnap {
let otherUsersAnswer = otherUserSnap.childSnapshot("answer").value as? String ?? "No Answer"
if orherUsersAnswer == thisUsersAnswer {
//do something because the answers match
}
}
})
Спасибо! Проблема в том, что мне нужно запустить оба этих оператора вместе. По сути, я пытаюсь сделать «если ключ мой uid, извлеките мои данные; для ключа, который не является моим uid, извлеките данные. Затем сравните мои данные с данными других людей». Таким образом, использование двух отдельных операторов if не позволит мне объединить два данных, верно?
@ml2008 Я понимаю. Проблема в вашем исходном коде, будь то этот пользователь или другой пользователь, вы «вытаскиваете» одни и те же данные answerElement.value as? [String: Any]
. Что и где эти данные пользователей по сравнению с данными других пользователей?
Он находится в той же таблице, поэтому я пытаюсь объединить свои выборки. Если вы видите в моей таблице firebase, мой uid — GqT6… и uid другого человека — HfL3… поэтому я хочу сравнить свои ответы да, да, да с их ответами да, да, да
@ml2008 Давай. Если вы посмотрите на мой ответ, вы увидите, что, когда вы перебираете answerElements, если это этот пользователь, то сделайте что-то с этими answerElement.value
данными, а если это другой пользователь, сделайте что-то с этими answerElement.value
данными. Если вы хотите сравнить ответы других пользователей с ответами этих пользователей, я бы получил эти данные пользователей из массива, чтобы отслеживать их, а затем удалить их из массива, а затем выполнить итерацию по массиву, выполняя сравнение.
Супер полезно! Не могли бы вы поделиться фрагментом того, как «следить за ним» после его удаления из массива?
@ml2008 ml2008 Я обновил ответ - он должен указать вам направление и помочь очистить ваш код.
Вы знаете, выполняется ли первый оператор if? Вы проверили, выполнены ли оба условия первого оператора if? Без некоторого примера ввода, который показывает, как воспроизвести проблему, ответ невозможен.