Не удалось получить пользователей - ошибка при использовании firebase, невозможно получить - PullRequest
0 голосов
/ 11 июля 2020

Я уже некоторое время пытаюсь создать контроллер представления, который позволяет вам искать и выбирать пользователей. У меня нет ошибок, и приложение создается успешно, но когда я go для поиска пользователей в панели UISearch, я вижу это предупреждение внизу: «Не удалось получить пользователей: failedToFetch». Я не уверен, почему это не удается. Пожалуйста, помогите.

failedToFetch появляется только в моей быстрой ячейке менеджера баз данных. Вот код для этого -

import Foundation
import FirebaseDatabase

final class DatabaseManager {

static let shared = DatabaseManager()

private let database = Database.database().reference()

static func safeEmail(email: String) -> String {
    var safeEmail = email.replacingOccurrences(of: ".", with: "-")
        safeEmail = safeEmail.replacingOccurrences(of: "@", with: "-")
    return safeEmail
}
}

extension DatabaseManager {

public func userExists(with email: String, completion: @escaping((Bool) -> Void)) {
    
    var safeEmail = email.replacingOccurrences(of: ".", with: "-")
    safeEmail = safeEmail.replacingOccurrences(of: "@", with: "-")
    
    database.child(safeEmail).observeSingleEvent(of: .value, with: { snapshot in
        guard ((snapshot.value as? String) != nil) else {
            completion(false)
            return
        }
        
        completion(true)
    })
}

// inserts new user to database
public func insertUser(with user: ChatAppUser, completion: @escaping (Bool) -> Void){
    database.child(user.safeEmail).setValue(["name": user.name], withCompletionBlock: { error, _ in
        guard error == nil else {
            print("failed to write to database")
            completion(false)
            return
        }
        
        self.database.child("users").observeSingleEvent(of: .value, with: { snapshot in
            if var usersCollection = snapshot.value as? [[String: String]] {
                //append to user dictionary
                let newElement = [
                    "name": user.name,
                    "email": user.safeEmail,
                ]
                usersCollection.append(newElement)
                self.database.child("users").setValue(usersCollection, withCompletionBlock: { error, _ in
                    guard error == nil else{
                        completion(false)
                        return
                    }
                    completion(true)
                })
            }
            else {
                //create that array
                let newCollection: [[String: String]] = [
                    [
                        "name": user.name,
                        "email": user.safeEmail
                    ]
                ]
                self.database.child("users").setValue(newCollection, withCompletionBlock: { error, _ in
                    guard error == nil else{
                        completion(false)
                        return
                    }
                    completion(true)
                })
            }
        })
    
        
    })
}

public func getAllUsers(completion: @escaping (Result<[[String: String]], Error>) -> Void) {
    database.child("users").observeSingleEvent(of: .value, with: { snapshot in
        guard let value = snapshot.value as? [[String: String]] else {
            completion(.failure(DatabaseError.failedToFetch))
            return
        }
        
        completion(.success(value))
    })
}

public enum DatabaseError: Error {
    case failedToFetch
}
}




struct ChatAppUser {
let name: String
let email: String

var safeEmail: String {
    var safeEmail = email.replacingOccurrences(of: ".", with: "-")
    safeEmail = safeEmail.replacingOccurrences(of: "@", with: "-")
    return safeEmail
}

}

1 Ответ

0 голосов
/ 04 августа 2020

Я знаю, какую серию руководств вы смотрите, и вам не хватает части перечисления localizedDescription.

public enum DatabaseError: Error {
        case failedToFetch
        
        public var localizedDescription: String {
            switch self {
            case .failedToFetch:
                return "Database fetching failed"
            }
        }
    }

Надеюсь, это поможет!

...