【问题标题】:Global Realm Object: Singleton or Fetch It Every Time?全局领域对象:单例还是每次都获取?
【发布时间】:2018-10-25 16:23:44
【问题描述】:

在我的应用程序中,我需要全局访问 currentUser,它是 User 类的实例,定义如下:

class User: Object{
  @objc dynamic var recordName = UUID().uuidString
  @objc dynamic var name = ""
  @objc dynamic var email = ""
  @objc dynamic var photo: Data? = nil

  override static func primaryKey() -> String? {
    return "recordName"
  }
}

currentUser 是在应用启动时建立的,我在应用中几乎所有地方都经常提到它。

我注意到,有时我会收到一个错误,似乎是由于在不同的地方引用此 currentUser 引起的:

从错误线程访问的领域

我大部分时间都可以跟踪 Realm 所在的线程,但很难涵盖所有情况。所以这引出了我的问题。

有没有一种安全的方法将currentUser 对象设置为单例?或者我应该将他们的 ID 保存到磁盘,然后每次需要时从 Realm 获取对象(如下所示)?

let realm = try! Realm()
if let currentUserId = defaults.string(forKey: "currentUserId"), let user = realm.object(ofType: User.self, forPrimaryKey: currentUserId){
  currentUser = user
}

我在 Xcode 10 上使用 Swift 4.2。谢谢!

【问题讨论】:

  • 你需要在每个线程中检索它

标签: swift realm singleton


【解决方案1】:

只要您可以确保始终从同一个线程访问您的 currentUser 对象,就可以将其设置为全局可访问对象一次并使用该自动更新引用而不是重新获取每次都来自 Realm。

您可以通过为 Realm 创建一个专用线程并在访问 Realm/currentUser 之前始终分派到该线程或简单地从系统线程(例如 DispatchQueue.main)执行此操作来实现此目的。

【讨论】:

  • 我同意并补充一点,如果您的应用程序中只有一个单例(例如,称为 DependencyManager)用于挂起所有其他全局对象,您将能够进行依赖注入使得单元测试可以访问单例并用模拟对象替换任何属性(任何对象)。
  • 有道理。非常感谢!
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多