首页 > 解决方案 > 无法获取用户 - 使用 firebase 时出错,无法获取

问题描述

一段时间以来,我一直在尝试创建一个视图控制器,它允许您搜索和选择用户。我没有错误,应用程序构建成功,但是当我在 UISearch 栏中搜索用户时,我在底部看到此警告:“无法获取用户:failToFetch”我不确定它为什么会失败。请帮忙。

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
}

}

标签: swiftdatabasexcodefirebaseuisearchbar

解决方案


我知道您正在观看哪个教程系列,并且您缺少枚举的本地化描述部分。

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

希望这会有所帮助!


推荐阅读