swift - 无法获取用户 - 使用 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
}
}
解决方案
我知道您正在观看哪个教程系列,并且您缺少枚举的本地化描述部分。
public enum DatabaseError: Error {
case failedToFetch
public var localizedDescription: String {
switch self {
case .failedToFetch:
return "Database fetching failed"
}
}
}
希望这会有所帮助!
推荐阅读
- spring-batch - 使用 Spring 批处理读取 CSV 文件并根据第一个字段映射到域对象,然后将它们相应地插入 DB
- java - 部署到实例时,EJB Timer 服务不可用
- apache-spark - 使用 Spark 转换 Oracle RAW 类型
- css - 如何使用 safari 的媒体查询缩小和捆绑 css 代码
- laravel-5 - 错误 Collection::appends 不存在在使用映射的分页中
- c# - 如何从 Azure CosmosDb 中的 BsonType 'Binary' 反序列化 'ObjectId'?
- corda - Corda:Corda 在隐式升级状态上的行为
- jquery - 通过 AJAX 请求访问 SharePoint-API 时如何解决 CORS 问题?
- java - 对象映射到具有休眠问题的数据库
- r - mailR:向服务器发送电子邮件失败