【发布时间】:2020-12-19 11:05:13
【问题描述】:
我正在尝试实现基于用户的领域数据库。因此,每次新用户注册时,都会使用他的 UID(来自 Firebase)创建一个 Realm 文件,或者如果存在,则访问该 Realm。 为此,我为领域调用创建了一个单音并设置领域配置。
我现在的问题是,每次我切换用户时,领域路径都会改变(我在用户登录后打印),但结果读数是相同的,因为用户没有改变,或者领域没有切换。更清楚地说,查询结果给出了相同的数据。
如果我打开实际的 Realms,数据会有所不同。
我在我的 tableView 中看到了这种行为,只是通过加载数据。
我做错了什么?
领域服务:
import Foundation
import RealmSwift
import Firebase
class RealmServices {
private init() {}
static let shared = RealmServices()
let userID = Auth.auth().currentUser!.uid
var realm = try! Realm(configuration: Realm.Configuration.init(
fileURL: Realm.Configuration().fileURL!.deletingLastPathComponent().appendingPathComponent("\(Auth.auth().currentUser!.uid).realm")))
func create<T:Object> (_ object: T) {
do {
try realm.write {
realm.add(object)
}
} catch {
post(error)
}
}
func update <T: Object>(_ object: T, with dictionary: [String : Any?]) {
do {
try realm.write {
for (key,value) in dictionary {
object.setValue(value, forKey: key)
}
}
} catch {
post (error)
}
}
func delete<T:Object> (_ object: T) {
do {
try realm.write{
realm.delete(object)
}
} catch {
post (error)
}
}
func post (_ error: Error) {
NotificationCenter.default.post(name: NSNotification.Name("RealmError"), object: error)
}
func observeRealmErrors (in vc: UIViewController, completion: @escaping (Error?)-> Void) {
NotificationCenter.default.addObserver(forName: NSNotification.Name("RealmError"), object: nil, queue: nil) { (Notification) in
completion(Notification.object as? Error)
}
}
func stopObservingError (in vc: UIViewController){
NotificationCenter.default.removeObserver(vc, name: NSNotification.Name("RealmError"), object: nil)
}
}
【问题讨论】:
-
如果您使用单例,并且在不重新启动应用程序的情况下切换用户,那么您的单例将始终引用同一个领域。多个用户的单例听起来是个坏主意。
-
但是新用户一登录,单音的 URL 就会改变,不是吗?
-
不,每次新用户登录时,您都需要使用适当的配置更新领域属性
-
如果你在本地设备上严格使用 Realm,单例模式很好——尽管它有它的缺点。但是,您与 Firebase 用户合作的方式可能存在问题。您使用什么过程来验证用户?他们在“切换”用户时如何未经身份验证?此外,更新您的代码以反映指南Configuring a local realm 中显示的内容可能是个好主意,因为我没有看到您使用默认配置填充它
-
@RobertCrabtree 我认为这里的目的是当用户通过身份验证并尝试从领域读取数据时,会根据他们的 firebase uid 使用适当的配置。换句话说,如果 user_a 已登录,则当他们读取领域时,它会在 /appname/user_a.realm 的领域路径中读取领域。每次读取 Realm 时,单例都会设置其 uid 的路径,因此单例模式适用于这种情况。